日期:2014-05-16 浏览次数:20546 次
mysql 索引学习记录
----by james
1 mysql索引的类型
在MySQL 中,主要有四种类型的索引,分别为:B-Tree 索引,Hash 索引,Fulltext 索引和RTree
其中hash索引在对待联合索引的处理上有点特别
比如一个name和email列的联合索引,
在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://wireless.qzone.qq.com 及 http://blog.csdn.net/wireless_tech (专注无线技术运营——无线技术(操作系统/数据库/WEB前端/负载均衡/系统容灾/系统安全/短信接入/WAP接入/3G等)、无线业务运营、无线开放平台、统计分析(用户行为分析/数据挖掘)、CP合作,联系我们:1780551083@qq.com)