- 每一个索引就对应着一棵树
(1) 主键:MySQL会以主键的值构造一棵树,其叶子节点存放着该主键对应的整行数据。因此一张表在数据结构上就等价于一颗以主键排序好的树
(2)辅助索引:自己建的索引一般都叫辅助索引,辅助索引树的叶子节点存放着两样东西,即辅助索引字段的值以及它所对应的主键值。因此当走辅助索引时,先从辅助索引树找到所需的主键,再到主键树上取出整行数据中的所需字段。举个例子,设ID为主键,updatetime为辅助索引,name无索引,体味下下面两条查询的不同:
select ID from table where updatetime = today
select name from table where updatetime = today
前者直接在辅助索引树的叶子节点取出ID就返回了,后者还要再去主键树根据ID取name
(3)联合索引:如KEY(updatetime, name),则辅助索引树的叶子节点存放着(updatetime,name,ID)并先按updatetime排序好,updatetime相同再按name排序。所以此时查询:select xx from table where name = xx是没法走这个联合索引的,但若是:select xx from table where updatetime = today order by name就很屌了,因为当根据updatetime = today取出来的rows已经按name排序好了
- 一次查询同一张表的话,只能用一条索引
(1)MySQL会很只能的去分析走哪条索引扫描量少,然后选择一条最优的索引进行select。因此若是表建了一些奇奇怪怪的索引时,反倒会干扰MySQL的分析
(2)对于一些区分度不高的索引,如status、type这类只有几个值的字段,建索引就没意义了(索引树的树杈太少)
(3)可以在查询时强制指定使用某一个索引,如select xx from xx FORCE INDEX(IX_updatetime),就会强制使查询走IX_updatetime这个索引
- 查询别乱写,否则容易导致查询无法使用索引
(1)like查询时,通配符“%”放在最前面时无法使用索引
select xxx like ‘%abc’无法走索引,select xxx like ‘a%bc’可以走索引
(2)对列的函数运算无法走索引
select xxx where md5(password) = ‘xxx’无法走索引
(3)OR子句也用不到索引
(4)等等很多情况