高性能MySQL--创建高性能的索引

关于MySQL的优化,相信很多人都听过这一条:避免使用select *来查找字段,而是要在select后面写上具体的字段。

那么这么做的原因相信大家都应该知道:减少数据量的传输。

但我要讲的是另外一个原因:使用select *,就基本不可能使用到覆盖索引(什么是覆盖索引,后面会说)。

而将一个本该可以用覆盖索引的查询变成了不能使用覆盖索引的查询,就会导致随机I/O或回表查询(回表查询在介绍聚簇索引的时候会说)。

 

一、索引的类型

  1、B-Tree索引

    大部分的MySQL引擎都支持这种索引,它是使用B-TREE的数据结构来存储数据(INNODB使用的B+TREE)。B+TREE是B-TREE的一个变种,区别是B+TREE为所有叶子结点增加了一个存储指向下个叶子结点的链指针和所有关键字都在叶子结点中出现(关于B+TREE和B-TREE的详细介绍,可以去百度搜下,这里就不详细介绍了)。

    B-TREE通常就意味着里面存储的所有值都是有序的,并且查询的时候,不用全表扫描,而是按照索引结构查找,所以会更快。

    适用查询:

全值匹配。是指和索引中的所有列进行匹配。

匹配最左前缀。就是多列索引的最左前缀原则。例如一个多列索引为(A,B,C),当你的查询中包括A或A,B或A,B,C都可以用到索引,如果只有B,则无法用到该索引。

匹配列前缀。举个栗子就是,像like 'abc%'可以用到索引,而like '%abc%'就无法用到该类索引。

匹配范围值。其实就是范围查询,但记住,当多列索引中有一列用到范围查询时,那么该列后面的索引都没法被用到。例如还是又一个索引为(A,B,C),又一个查询为where A=1, B>1, C=1,那么这个查询只会用到(A,B,C)中的A,B列,C是不会被用到。

只访问索引的查询。其实就是覆盖索引查询。

    当然如果查询满足以上条件,当然也就可以用这些列进行排序。

  2、哈希索引

    哈希索引是基于哈希表实现的。只支持精确索引查询。在MySQL中,目前只有Memory引擎支持哈希索引,但我们可以自定义哈希索引。具体思路是这样的:

    在表中创建一列用来存储哈希值,然后还是用B-TREE索引进行查找。下面是一个实例:

    例如一个表中需要存储大量的URL,如果正常使用B-TREE来存储URL,存储的内容就会很大,导致索引会很大。如果我们增加一列(url_hash)存储URL的哈希值,然后在这列上建立B-TREE索引,这样做的性能会高很多。因为当数据量非常大的时候,哈希会存在哈希冲突,所以在查询的时候要用到url和url_hash两列进行筛选。如:

select id from url where url='www.baidu.com' and url_hash='123213512987';

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyypp.html