数据库索引优化
索引优化策略
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)位例(注意和顺序有关)
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)
希望此题对大家有帮助