索引概念和作用
索引是一种使记录有序化的技术,它可以指定按某 列/某几列预先排序,从而大大提高查询速度(类似 于汉语词典中按照拼音或者笔画查找)。
索引的主要作用是加快数据查找速度,提高数据库 的性能。
MySQL索引类型
从物理存储角度上,索引可以分为聚集索引和非聚 集索引。
1.聚集索引(Clustered Index)
聚集索引决定数据在磁盘上的物理排序,-个表只 能有一个聚集索引。
2.非聚集索引(Non-clustered Index)
引上只包含被建立索引的数据,以及一个行定位符 row-locator, 这个行定位符,可以理解为一个聚集 索引物理排序的指针,通过这个指针,可以找到行 数据
从逻辑角度,索引可以分为以下几种。
1.普通索引:最基本的索引,它没有任何限制。2.唯一索引:与普通索引类似,不同的就是索引 列的值必须唯一-, 但允许有空值。如果是组合 索引,则列值的组合必须唯-
3.主键索引:它是一种特殊的唯一 索引,用于唯ll 一标识数据表中的某一条记录, 不允许有空 值,- -般用primary key来约束。主键和聚 集索引的关系详见"问题详解”中的第4题。4.联合索引(又叫复合索引) :多个字段上建立 的索引,能够加速复合查询条件的检索。5.全文索引:老版本 MySQL自带的全文索引 只能用于数据库引擎为MyISAM的数据表, 新版本MySQL 5.6的InnoDB支持全文索引 默认MySQL不支持中文全文检索,可以通过 扩展MySQL,添加中文全文检索或为中文内 容表提供对应的英文索引表的方式来支持
MySQL索引优化规则
可以通过以下规则对MySQL索引进行优化。
1.前导模糊查询不能使用索引。
例如下面SQL语句不能使用索引。
select * fromdoc where title like '%XX’ 而非前导模糊查询则可以使用索引,如下面的SQL 语句。
select * fromdoc where title like ‘XX%’
页面搜索严禁左模糊或者全模糊,如果需要可以用 搜索引擎来解决。
2.union、 in、 or 都能够命中索引,建议使用in。
示例代码如下:
select * fromdoc where status=1
unionall
select * fromdoc where status=2
直接告诉MySQL怎么做,MySQL 耗费的CPU最 少,但是-般不这么写sQL。
●in:能够命中索引。.
示例代码如下:
select * fromdoc where status in (1, 2) 查询优化耗费的CPU比union all多,但可以忽略 不计,一般情况下建议使用in
●or:新版的MySQL能够命中索引。
示例代码如下:
select * fromdoc where status= 1 or status =2 查询优化耗费的CPU比in多,不建议频繁用or。3.负向条件查询不能使用索引, 可以优化为in查 询
负向条件有: !=、<>、not in、not exists、not like 等
例如下面代码:
select * fromdoc where status != 1 and status != 2 可以优化为in查询:
select * fromdoc where status in (0,3,4)
4.联合索引最左前缀原则(又叫最左侧查询)
●如果在(a,b,c)三个字段上建立联合索引,那么 它能够加快a I(a,b) |(a,b,c)三组查询速度。
例如登录业务需求,代码如下。
selectuid,
login_ time from user where login. name=? andpas 可以建立(login name, passwd)的联合索引。
因为业务上几乎没有passwd的单条件查询需求, 而有很多login name的单条件查询需求,所以可
(passwd, login. name)。
●建联合索引的时候,区分度最高的字段在最左
●如果建立了(a,b)联合索引,就不必再单独建立 a索引。同理,如果建立了(a,b,c)联合索引,
就不必再单独建立a、(a,b) 索引。
●存在非