本节后边通过实际易懂的举例,来说明索引实际的触发,从而优化自己在加索引时使用的策略。

一.索引类型

1.1 B-tree索引

  注: 名叫 btree 索引 , 大的方面看 , 都用的平衡树 , 但具体的实现上 , 各引擎稍有不同 ,

比如,严格的说 ,NDB 引擎 , 使用的是 T-tree ,Myisam,innodb中 , 默认用 B-tree 索引

但抽象一下---B-tree系统 , 可理解为 ” 排好序的快速查找结构 ” .  更多信息见: Mysql-索引-BTree类型【精简】

1.2 hash索引

  在memory表里 , 默认是 hash 索引 , hash 的理论查询时间复杂度为 O(1)

疑问: 既然 hash 的查找如此高效 , 为什么不都用 hash 索引 ?

答:

1:hash函数计算后的结果 , 是随机的 , 如果是在磁盘上放置数据 , 比如主键为id为例 , 那么随着 id 的增长 , id 对应的行 , 在磁盘上随机放置 .

2: 不法对范围查询进行优化 .

3: 无法利用前缀索引 . 比如 在 btree 中 , field 列的值 “ hellopworld ” ,并加索引,查询 xx=helloword,自然可以利用索引 , xx=hello, 也可以利用索引 . ( 左前缀索引 ) 。因为hash( ‘ helloword ’ ),和 hash(‘ hello ’ ),两者的关系仍为随机, 其实就是因为HASH是精准的

4: 排序也无法优化 .

5: 必须回行 . 就是说 通过索引拿到数据位置 , 必须回到表中取数据

 


二.btree索引的常见误区

 2.1 在where条件常用的列上都加上索引

  例: where cat_id=3 and price>100 ; //查询第 3 个栏目 ,100 元以上的商品

  误: cat_id上 , 和 , price 上都加上索引 .

  错: 只能用上cat_id或Price索引,因为是独立的索引结构,同时只能用上1个。详细排列叙述, 请见Mysql-索引结构直观图解

MySQL的in优化走索引 mysql索引优化策略_字段

2.2 多列索引上,索引发挥作用,需要满足左前缀要求.

误: 在多列上建立索引后 , 查询哪个列 , 索引都将发挥作用

以 index(a,b,c) 为例,

MySQL的in优化走索引 mysql索引优化策略_sql_02


 三.总结:

1.联合索引的顺序遵循左前缀原理,必须层层连贯,SQL语句中where条件没有前后关系, 如上边4,5查询举例

2.涉及到like < > 等范围查询,此查询后的索引用不上 如7

3.在1层层嵌套的前提下,用到了order排序,order排序不参加where条件,注意[where 字段a order by 字段a] 的问题,其实[order a ]假命题,因为已经 等于a 了还排哪门子序

4.在 select查询中的where,多个条件无顺序,但是索引添加时得注意顺序,同一。

5.group 在分组中的工作原理: 先order_by 排序 ,创建临时表 ,如果建了索引,就能省去创建临时表,所以索引对group有效