mysql优化(二)索引

数据库索引优化

索引优化策略

1索引类型

1.1B-tree索引

名叫Btree,大方面看都用的平衡树,但是具体是实现上,各引擎稍有不同比如严格的说
INDB引擎使用的是T-tree
Myisam,innodb默认使用B-Tree索引
排好序的快速查找结构

1.2hash索引

在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’)两者关系仍为随机。
4 排序也无法优化
5 必须回行 也就是说通过索引拿到数据位置,必须回到表中取数据

2:btree索引的常见误区

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

列:where cat_id=3 and price>100;查询第三个栏目,100元以上的商品
Cat_id上或price上都加上索引
只能用上cat_id或price索引,因为独立的索引同时只能用上1个

联合索引(多个列看成整体值建立索引)

2.2 在多列上建立索引后查询那个列索引都将发挥作用

多列索引上索引发挥作用,需要满足左前缀要求
以index(a,b,c)位例(注意和顺序有关)

1
2
3
4
5
6
7
8
9
| 语法 | 索引是否发挥作用 |
|Where a=3 |是 只使用a列 |
|Where a=3 and b=5 |是 使用a b 列 |
|Where a=3 and b=5 and c=4 | 是 使用a b c 列 |
|Where b=3 / where c=4 |否 |
|Where a=3 and c=4 |a列能发挥索引,c不能 |
|Where a=3 and b>10 and c=7 |a能利用,b能利用,c不能利用|
|where a=3 and b like ‘XXX%’ and c=7|a能利用,b能利用,c不能利用|
|where a=3 and b like ‘%XXX’ |a能利用,b不能利用 |

abc三个索引ab相连接,bc相连接,都通则都能用否则断开后面索引都不能
什么是左前缀(左边准确等于几,后面不知道可以)

看题:

假设某个表有一个联合索引(C1,C2,C3,C4)以下--只能使用联合索引的C1,C2,C3部分
  A where C1=x and C2=x and C4>x and C3=x (C1,C2,C3可以用到联合索引,C4可以用一半)
  B where C1=x and C2=x and C4=x order by C3=x(C1,C2,C3可以用到联合索引)
  C where C1=x and C4=x ground by C3,C2(只用C1,若ground byC2,C3则索引为C1,C2,C3)
  D where C1=? and C5=? order by C2,C3(同上)
  E where C1=? and C2=? and C5=? order by C2,C3 (查找使用C1,C2 排序使用C3)

希望此题对大家有帮助