mysql 索引学习记录

1 mysql索引的类型

MySQL 中,主要有四种类型的索引,分别为:B-Tree 索引,Hash 索引,Fulltext 索引和RTree

 

其中hash索引在对待联合索引的处理上有点特别

比如一个nameemail列的联合索引,

innodb,myisam中,是B-Tree索引,

select * from tb where name="james" 将会使用该索引

 

而如果是在memdb,此时该查询将找不到索引

 

 

2 索引的选择

4.0版本的mysql一个查询只能使用一个索引,所以选择索引对性能的影响尤其明显。

类似于联合查询中小结果集驱动大结果集,索引应该选择散列度最高的。

 

比如查询流水表某个账户的某条流水时,由于历史原因,可用的索引只有一个按账户号码。

 

 

那么查询某账户所有流水使用

select * from water where fuin=10001; 显然是足够的

 

 

而如果查询某个用户某个订单号的记录信息

select * from water where fuin=10001 and fserial_no=88888;

由于一张表中相同用户的号码的流水很多,所以按索引找到fuin=10001这个子集以后需要遍历该子集所有才能找到合适的记录,

 

此时最佳的方案是建立一个订单号索引,或者建立一个联合索引,当然,建索引会锁表,这是现网中要考虑的一个问题。

 

上面是索引不够用的情况的,相反的,如果有多个索引,按照散列度选择最靠谱的索引也是需要使用explain,profile分析出最佳索引。

 

 

 

3 索引的弊端

对于插入频繁的表,索引过多会增加插入的时间,因为插入后要更新索引。

所以规避的方法就是读写表分离,把查询所需的索引建在读表上,可兼顾读写的效率。

 

4 优化

现网中应该增加对慢查询的监控,可以即时发现db的运行状态。

 

原文来自:http://ask.itruanjian.com/?note/view/4211.html

猜你喜欢

转载自wddpwzzhao123.iteye.com/blog/1832112