MySQL的索引
索引的类型
-
普通索引
-
唯一索引
-
主键索引
-
组合索引
-
全文索引
普通索引
是最基本的索引,它没有任何限制。
唯一索引
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引:
组合索引
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合
全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。
索引建立的规则
-
表的主键和外键必须要有索引
-
表的数量超过 300 w 要建立索引
-
经常出现在
where
子句中的字段,要创建索引 -
频繁更新的表上不建议建立太多索引
-
及时删除未使用的索引
建立复合索引时应该考虑的问题
-
正确选择复合索引中的主列字段,一般是选择性较好的字段;
-
复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
create index idx_name on student(name); -- 在name 字段上建立唯一索引;
create index idx_age on student(age); -- 在age 字段上建立唯一索引;
select * from student where name = "小李";
select * from student where age=18;
select * from student where name="小李" and age =18; -- 走索引;
select * from student where name="小李" OR age =18; -- 不走索引;
如果我们是在name 和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效 率,但是如果在name、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(name, age, class)的复合索引,那么其实相当于创建了(name,age,class)、(name,age)、(name)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。
再者:如果经常需要同时对两个字段进行AND查询,那么使用两个单独索引不如建立一个复合索引,因为两个单独索引通常数据库只能使用其中一个,而使用复合索引因为索引本身就对应到两个字段上的,效率会有很大提高。
为什么mysql的每次查询都只会用一个索引呢?这是因为 N 条独立索引同时在一条语句使用的消耗比只使用一个索引还要慢。
索引失效的情况
- 全值匹配索引最佳。注意:和索引的顺序是没有关系的,Mysql的优化器会自动的进行优化,调整索引的顺序。
explain select * from user where name = 'zhangsan' and age = 20 and pos = 'cxy' and phone = '18730658760';
- 尽量使用覆盖索引,不要使用 select *
explain select name,age,pos,phone from user where age = 20;
- 违反最左前缀法则:从索引的最左前列开始并且不跳过索引中的列
explain select * from user where age = 20 and phone = '18730658760' and pos = 'cxy';
- 在索引列上做操作
explain select * from user where age/5=20; --进行了数学运算
explain select * from user where left(name,5) = 'zhangsan' and age = 20 and phone = '18730658760';
- 在索引列上使用了不等号
explain select * from user where age != 20;
explain select * from user where age <> 20;
- like 中 % 加到前面
explain select * from user where name like '%zhangsan';
- 字符串不加单引号
explain select * from user where name = 2000
mysql的性能分析,以及各参数的含义
索引的缺点
1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存一下索引文件。
2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
- 索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
参考文献
https://www.cnblogs.com/luyucheng/p/6289714.html
https://segmentfault.com/a/1190000021464570
https://www.cnblogs.com/yaorongke/p/14866092.html