`

mysql索引hash索引和b-tree索引的区别

 
阅读更多

mysql下增加索引的方式:

修改表结构:

ALTER mytable ADD INDEX [indexName] ON (username(length))

创建表结构

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );

删除索引的语法:

DROP INDEX [indexName] ON mytable;

 

下面是mysql具有的索引类型:

1、唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

◆创建索引

CREATE UNIQUE INDEX indexName ON mytable(username(length))

◆修改表结构

ALTER mytable ADD UNIQUE [indexName] ON (username(length))

◆创建表的时候直接指定

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );

 

 2、主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) ); 当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

 

 

3、组合索引

为了形象地对比单列索引和组合索引,为表添加多个字段:

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL ); 为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age); 建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:

usernname,city,age usernname,city usernname 为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:

SELECT * FROM mytable WHREE username="admin" AND city="郑州" SELECT * FROM mytable WHREE username="admin" 而下面几个则不会用到:

SELECT * FROM mytable WHREE age=20 AND city="郑州" SELECT * FROM mytable WHREE city="郑州"

 

 

建立索引的时机;

到这里我们已经学会了建立索引,那么我们需要在什么情况下建立索引呢?一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。例如:

SELECT t.Name FROM mytable t LEFT JOIN mytable m ON t.Name=m.username WHERE m.age=20 AND m.city='郑州' 此时就需要对city和age建立索引,由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。

刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时,MySQL不会使用索引。例如下句会使用索引:

SELECT * FROM mytable WHERE username like'admin%' 而下句就不会使用:

SELECT * FROM mytable WHEREt Name like'%admin' 因此,在使用LIKE时应注意以上的区别。

 

使用索引时的注意事项:

1、默认可以为null的列,索引不起作用。

2、使用短索引,不能列的长度有多长,索引就建立多长

3、mysql查询默认只使用一个索引,如果加上排序的话,最好给他们加上复合索引,要不然排序非常影响效率

4、不要在列上做运算,这样会导致索引失效

5、不适用 not in 和<>

分享到:
评论

相关推荐

    MySQL Hash索引和B-Tree索引的区别

    MySQL Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。...

    1,int(20)中20的涵义 2,为什么索引结构默认使用B+Tree,而不是Hash,二叉树,红黑树? 3、MySQL里记录

    2,为什么索引结构默认使用B+Tree,而不是Hash,二叉树,红黑树? 3、MySQL里记录货币用什么字段类型好 4、数据库自增主键可能遇到什么问题。 5、从锁的类别角度讲,MySQL都有哪些锁呢? 6、索引失效情况? 7、优化...

    面试mysql 之索引 锁 事物

    什么是索引,index 索引:是帮助高效获取数据的数据结构 索引也可能是一个文件 那么多存储结构 hash map 红黑树 二叉树等 为什么mysql底层要用B+ tree实现?

    Mysql中的Btree与Hash索引比较

    主要介绍了Mysql中的Btree与Hash索引比较,本文起讲解了B-Tree 索引特征、Hash 索引特征等内容,需要的朋友可以参考下

    怎样正确创建MySQL索引的方法详解

    索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低...Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引)。索引如图所示:

    Mysql覆盖索引详解

    2、Hash 和full-text索引不存储值,因此MySQL只能使用B-TREE 3、并且不同的存储引擎实现覆盖索引都是不同的 4、并不是所有的存储引擎都支持它们 5、如果要使用覆盖索引,一定要注意SELECT 列表值取出需要的列,

    MYSQL索引

    mysql中索引是在存储引擎层而不是服务器层实现的B-Tree索引B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同。图中根节点没有画出来。B-Tree对索引列是顺序组织存储的,索引很适合查找...

    MySQL索引和引擎

    一.索引 ...B-Tree … 索引案例 比如现在,MySQL中有这么一张表 test,需要进行查询(select * from test where id = 5) id value 1 12 2 23 3 232 4 121 5 45 6 67 7 55 在不

    mysql索引和explain的详解

    MyISAM和InnoDB存储引擎:只支持B+ TREE索引, 也不能够更换 MEMORY/HEAP存储引擎:支持HASH和BTREE索引 B树图示 B树是为了磁盘或其它存储设备设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,...

    mysql系列【你不知道的索引优化】(面试必问)

    前言:相信大家面试的时候肯定被问过这个问题,但很多都是因为不够深入,或者了解片面而导致好的机会和你失之交臂,其实这个问题答得好是非常加分...常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,我们使用的是I

    mysql面试看这篇就够了

    一、什么是索引 索引可以类比成书本的目录方便我们查找数据使用 ...Mysql表常用索引结构有两种BTree和Hash其中BTree又分为B-Tree和B+Tree本文只介绍BTree 在谈Mysql常用的几种索引结构之前我们先回忆一下我们学过的

    MySQL中InnoDB数据结构和索引介绍

    一、为什么选用B+Tree 为何数据库中选用数据结构作为索引 数组:查询时间还行,当时插入和更新很慢。 链表:查询时间长。 hash : 定位效率高,但是没有顺序性。 树结构:B+树在查询和插入都是非常适合的 为什么选用B...

    MySQL2023年高级面试题,中级面试题,大汇总.txt

    2,为什么索引结构默认使用B+Tree,而不是Hash,二叉树,红黑树? 3、MySQL里记录货币用什么字段类型好 4、数据库自增主键可能遇到什么问题。 5、从锁的类别角度讲,MySQL都有哪些锁呢? 6、索引失效情况? 7、优化...

    理解MySQL——索引与优化总结

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库...如果对之建立B-Tree索引,则只需要进行log100(10^6)=3次页面读取,最坏情况下耗时30ms。这就是索引带来的效果,很多时候,当你的应用程序进行

    MYSQL查询调优实战

    • 常用的索引 – B+ Tree Index – T Tree Index – Hash Index • 什么是索引? – 提高查询速度??? – It depends – 减少IO次数

    MySQL 8.0.18 Hash Join不支持left/right join左右连接问题

    在MySQL 8.0.18中,增加了Hash Join新功能,它适用于未创建索引的字段,做等值关联查询。在之前的版本里,如果连接的字段没有创建索引,查询速度会是非常慢的,优化器会采用BNL(块嵌套)算法。 Hash Join算法是把...

Global site tag (gtag.js) - Google Analytics