【转载】MySQL索引优化

MySQL索引优化

  MySQL官方对索引的定义:索引是帮助MySQL高效获取数据的数据结构。索引是在存储引擎中实现的,因此每种存储引擎中的索引都不同。如MYISAM和InnoDB存储引擎只支持BTree索引;MEMORY和HEAP储存引擎能够支持HASH和BTREE索引。html

  这里仅针对经常使用的InnoDB存储引擎所支持的BTree索引进行介绍:mysql

1、索引类型

先建立一个新表,用于演示索引类型git

复制代码
CREATE TABLE index_table (
    id BIGINT NOT NULL auto_increment COMMENT '主键',
    NAME VARCHAR (10) COMMENT '姓名',
    age INT COMMENT '年龄',
    phoneNum CHAR (11) COMMENT '手机号',
    PRIMARY KEY (id)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
复制代码

下图是Col2为索引列,记录与B树结构的对应图,仅供参考:

                  

 

一、普通索引

这是最基本的索引,没有任何限制。算法

------直接建立索引
create index index_name on index_table(name);

二、惟一索引

索引列的值必须惟一,能够有空值sql

---------直接建立惟一索引
create UNIQUE index index_phoneNum on index_table(phoneNum);

三、主键

是一种特殊的惟一索引,必须指定为 PRIMARY KEY,如咱们经常使用的AUTO_INCREMENT自增主键微信

四、多列索引

也称为组合索引,就是在多个字段上联合创建一个索引数据结构

-------直接建立组合索引
create index index_union on index_table(name,age,phoneNum);

这里一个组合索引,至关于在有以下三个索引:post

name;优化

name,age;url

name,age,phoneNum;

这里或许有这样一个疑惑:为何age或者age,phoneNum字段上没有索引。这是因为BTree索引因要遵照最左前缀原则,这个原则在后面详细展开。

 2、索引优化

一、选择索引列

建立索引简单,可是在哪些列上建立索引则须要好好思考。能够考虑在where字句中出现列或者join字句中出现的列上建索引

复制代码
SELECT
    age----不使用索引
FROM
    index_union
WHERE
    NAME = 'xiaoming'---考虑使用索引
AND phoneNum = '18668247687';---考虑使用索引
复制代码

二、最左前缀原则

  联合索引(name,age,phoneNum) ,B+树是按照从左到右的顺序来创建搜索树的。如('张三',18,'18668247652')来检索数据的时候,B+树会优先匹配name来肯定搜索方向,name匹配成功再依次匹配age、phoneNum,最后检索到最终的数据。也就是说这种状况下是有三级索引,当name相同,查找age,age也相同时,去比较phoneNum;可是若是拿 (18,'18668247652')来检索时,B+树没有拿到一级索引,根本就没法肯定下一步的搜索方向。('张三','18668247652')这种场景也是同样,当name匹配成功后,没有age这个二级索引,只能在name相同的状况下,去遍历全部的phoneNum。

  B+树的数据结构决定了在使用索引的时候必须遵照最左前缀原则,在建立联合索引的时候,尽可能将常常参与查询的字段放在联合索引的最左边。                  

三、like的使用

通常状况下不建议使用like操做,若是非使用不可的话,须要注意:like '%abd%'不会使用索引,而like ‘aaa%’可使用索引。这也是前面的最左前缀原则的一个使用场景。

四、不能使用索引说明

mysql会按照联合索引从左往右进行匹配,直到遇到范围查询,如:>,<,between,like等就中止匹配,a = 1 and b =2 and  c > 3 and d = 4,若是创建(a,b,c,d)顺序的索引,d是不会使用索引的。但若是联合索引是(a,b,d,c)的话,则a b d c均可以使用到索引,只是最终c是一个范围值。

五、order by

order by排序有两种排序方式:using filesort使用算法在内存中排序以及使用mysql的索引进行排序;咱们在部分不状况下但愿的是使用索引。

1
select  test_index  where  id = 3  order  by  id  desc ;

若是ID是单列索引,则order by会使用索引

1
select  test_index  where  id = 3  order  by  name  desc ;

若是ID是单列索引,name不是索引或者name也是单列索引,则order by不会使用索引。由于Mysql的一次查询只会从众多索引中选择一个索引,而此次查询中使用的是ID列索引,而不是name列索引。在这种场景下,若是想让order by也使用索引的话,就创建联合索引(id,name),这里须要注意最左前缀原则,不要创建这样的联合索引(name,id)。

最后须要注意mysql对排序记录的大小有限制:max_length_for_sort_data 默认为1024;也就意味着若是须要排序的数据量大于1024,则order by不会使用索引,而是使用using filesort。

  

 
分类:  MYSQL
标签:  索引优化
好文要顶  关注我  收藏该文   
0
0
 
 
 
« 上一篇: 什么是B+Tree
posted @  2017-07-29 11:41 冬瓜蔡 阅读(80) 评论(0) 编辑 收藏
相关文章
相关标签/搜索