索引的应用

来源:互联网 发布:seo视频教程 编辑:程序博客网 时间:2024/06/05 14:35

索引对数据库的性能有很重要的作用,合理使用索引,并优化自己的SQL来利用索引可以有效提高数据库的查询效率。

何时使用索引

OLAP和OLTP应用每次查询的数据量不同,索引的使用也不同,OLTP应用每次根据index查询少量数据,索引的利用率是有效的,但是LOAP每次获取大量数据,查询优化器可能不会使用索引;

对于关键数据,频繁查询的数据,添加索引有效提升效率,尤其是索引覆盖。

联合索引

数据库联合索引可以有效的形成索引覆盖,并且因为联合索引的第二个值是排序的,索引可以减少数据的查询,尤其是group by、order by的时候。

比如:

create index idx_a_b on t (a,b);可以使用索引idx_a_b的语句:select * from t where a = xx and b = xx;select * from t where a = xx;不可以使用的语句:select * from t where b = xx;可以有效减少排序的select * from t where a = xx group by b;select * from t where a = xx order by b;

对于(a,b)索引,假如所以值为(1,2)(2,3)(2,1),可以看见,索引是按照a的值排序的,索引a = xx and b =xx肯定是可以走索引的。单独使用a = xx也是可以的因为1,2,2是排序好的,但是b的value没有排序,所以无法走索引;

联合索引的第二个键值是排序好的,比如要查询某个user的最近三次购买记录。则使用idex_userId_buyTime(userId,buyTime)可以减少一次数据库排序:

select * from order where userId = xxx order by buytime desc limit 3;

索引覆盖

索引覆盖可以成为是一种现象或者结果,并不是一种索引类型,简单理解就是,我们创建的辅助索引(a,b)或者(a,b,c)在查询时,我们仅需要select a,b from t ,这个时候仅仅需要辅助索引a,b即可。这就是索引覆盖,也成为覆盖索引。能大大提升效率,减少IO;

不要将所有数据都建立覆盖索引也就是index (a,b,c…..,d),这样索引文件过大,也是不合适的。

索引失效

范围查找和join操作会引起失效,但是某些情况下,比如对oderId建立辅助索引。但是explain显示使用的是表扫描而不是索引扫描:

select * from order where orderId > 100 and orderId < 10000;

这是因为,辅助索引定位到数据还需要bookmark再做一次IO查询到数据,索引远不如使用primary key的索引直接定位row数据来的快。

查询优化器的原则是减少逻辑IO,也就能减少实际物理IO,尽量用顺序读,来减少随机读。使用辅助索引原则:通过辅助索引查询到的数据是少量的。

Sql优化

Sql优化的一大原则是尽量走索引,减少全表扫描。更多的Sql优化做法单独总结;

原创粉丝点击