关闭

MySQL的索引

标签: mysql索引
191人阅读 评论(0) 收藏 举报
分类:
  • 每一个索引就对应着一棵树
(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)等等很多情况 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18840次
    • 积分:914
    • 等级:
    • 排名:千里之外
    • 原创:76篇
    • 转载:1篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论