mysql下的索引使用原则

 

为表创建索引,无疑是对数据库比较好的优化方式之一。如下是本身对索引的总结。mysql

 

MYSQL QUERY Optimizer对索引的选择sql

1.即便一个SQL能够选择多个索引,可是大多数状况下它都会选择一个索引,而放弃其它的索引。数据库

 

使用索引的前提:并发

1.索引的存是在where条件以后的。ide

 

2.在MYSQL中不一样的存储引擎对索引的对待也是有点不同的。优化

 

经常使用的索引类型以及状况排序

前缀索引(又叫短索引)索引

 

对串列进行索引,若是可能应该指定一个前缀长度。例如,若是有一个CHAR(255)的 列,若是在前10 个或20 个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不只能够提升查询速度并且能够节省磁盘空间和I/O操做。资源

 

示例代码:get

//建立短索引

create index ix_test on t(col(200))

//适用的状况

SELECT userName,income FROM t WHERE col like 'john%';

也就是说: 短索引的适用范围主要是在like以后第一个非’%’的实例。

 

组合索引

 

好比有一条语句是这样的:select * from users where area=’beijing’ and age=22;

若是咱们是在area和age上分别建立单个索引的话,因为mysql查 询每次只能使用一个索引,因此虽然这样已经相对不作索引时全表扫描提升了不少效率,可是若是在area、age两列上建立复合索引的话将带来更高的效率。 若是咱们建立了(area, age, salary)的复合索引,那么其实至关于建立了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀 特性。

 

对于组合索引,MYSQL数据库所进行查询的原理:

 

select * from users where area=’beijing’ and age=22;

select * from users where area=’beijing’;

若是area有索引,则以上的SQL语句都会使用索引,由于组合索引有最佳左前缀的特性,而select * from users where age=22; 则不会使用索引。

 

所以咱们在建立复合索引时应该将最经常使用做限制条件的列放在最左边,依次递减。

 

单键索引仍是组合索引

在通常的应用场景中,只要不是其中某个过滤字段在大多数场景下能过滤90%以上的数据(这种可能性很小),而其余的过滤字段会频繁的更新,通常 更倾向于建立组合索引,尤为是在并发量较高的场景下。由于当并发量较高的时候,即便只为每一个Query节省了不多的 IO 消耗,但由于执行量很是大,所节省的资源总量仍然是很是可观的。

 

固然,建立组合索引并非说就需要将查询条件中的全部字段都放在一个索引中,还应该尽可能让一个索引被多个 Query 语句利用,尽可能减小同一个表上的索引数量,减小由于数据更新带来的索引更新成本,同时还能够减小由于索引所消耗的存储空间。

 

有OR在SQL语句中来使用索引的状况

若是有or,where后面就必须全面条件有索引,不然索引将不会起做用,因此必定要为or的所有字段建立索引

 

SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';

 

ordery by以及索引排序

mysql查询只使用一个索引,所以若是where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。

 

所以数据库默认排序能够符合要求的状况下不要使用排序操做;(排序功能由索引来完成)尽可能不要包含多个列的排序,若是须要最好给这些列建立复合索引。

相关文章
相关标签/搜索