为什么要索引?
索引可以帮助我们更快的查询
每个字段都可以加索引
索引的不好之处
所以也要耗费内存,所以索引不宜过多
对于经常作为查询条件的字段,加索引
因为索引利于增加查询速率,因为一般索引加到where 后面的条件字段
对于经常用来插入、修改、删除的字段,尽量不加索引
所以虽然索引可以加快查询速度,但不是越多越好,要加在合适的字段,合适的数量
索引的分类:
1 单列索引 一个字段作为一个索引,可以有多个单列索引
1.1 普通索引 普通索引的值可以重复,也可以是空
1.2 唯一索引 唯一索引的值不可以重复,但是可以为空(空值可以多个)
1.3 主键索引(特殊的唯一索引)
2 组合索引
3 全文索引(全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引)
4 空间索引
是不是走了索引?
看是不是走了所以,可以执行查询的时候加上一个 EXPLAIN ,最后返回的结果字段里面看key那个字段,key字段的值表示走的哪个索引,
如果没走索引,值为NULL(type字段值也可以看出来:如果值是ALL表示全表扫描,如果不是ALL表示不是全表扫描)
1 单列索引
将字段作为where作为条件时
1.1 如果这个字段是加了索引的,才可能会走索引
1.1.1 值查找到了,会走索引
1.1.2 值不存在,则没有走索引
如:select * from user where id=11;
如果11存在,则走索引,否则不走
1.1.3 like时需注意:
1 date like '2019%' 走索引
2 date like '%2019%' 不走索引
1.2 该字段没加索引,是不可能会走索引的
1.3 where条件有一个字段加了索引,有一个没加,那么不会走索引
如:EXPLAIN SELECT * FROM zst.`analysis_ssq_base_red_blue` model WHERE issue_no='2019001' AND model.`win_number`='11,16,17,22,26,32,04';
issue_no加了索引,win_number没加索引,最终结果就是没走索引(这种如果需要他们走索引的话,需要使用组合索引)
2 组合索引
举例:表 bet_game_issue 组合索引为 game_id,issue_no 索引名为game_id
1 EXPLAIN SELECT * FROM zst.`bet_game_issue` model WHERE issue_no LIKE '%2019%' AND model.game_id='101';
走索引
2 EXPLAIN SELECT * FROM zst.`bet_game_issue` model WHERE model.game_id='101' and issue_no LIKE '%2019%';
2个字段的先后顺序返回来,还是走索引
3 EXPLAIN SELECT * FROM zst.`bet_game_issue` model WHERE model.issue_no = '2019001';
where 后面跟组合索引中的后面那个字段时,不走索引,如果where model.game_id='101';会走索引,这个是最左前缀原则
4 EXPLAIN SELECT * FROM zst.`bet_game_issue` model WHERE model.game_id='101' ORDER BY model.`ISSUE_NO` DESC;
order by排序时使用组合索引字段,这样和1,2的效果是一样的,走索引
查看某个表的索引
SHOW INDEX FROM zst.`bet_game_issue`;
如何创建和删除索引可以看这里:https://www.runoob.com/mysql/mysql-index.html
什么时候索引字段不会走索引:
1 索引字段判断的值不存在,则不会走索引
2 组合索引,where 条件值判断了一个,则不走索引
3 给索引字段加上函数,会导致索引失效。
如:EXPLAIN SELECT * FROM zst.`analysis_ssq_base_red_blue` model WHERE LENGTH(model.`issue_no`) = 7;
4 组合索引中,遵循最左原则,如索引组合为(id,name),则:
1 where id=xx; OK
2 where id=xx and name=xx; OK
3 where name=xx; NO
上面的结果是因为必须最左边的索引字段得在才行,都在的情况下顺序没影响
5 where 条件后面跟了2个字段的条件,其中一个字段是索引字段,一个是非索引字段,则最终是不会走索引
也就是说,where条件中有非索引字段的存在也不会走索引
6 使用like时,前面有'%','_'这种字符的,不会走索引,而后面有则不影响,会走索引
1 date like '2019%' 走索引
2 date like '%2019%' 不走索引
7 ...
不明白的?
1 EXPLAIN SELECT * FROM zst.`bet_game_issue` model WHERE model.game_id='101' and model.`STATUS`>0 ORDER BY model.`ISSUE_NO` DESC;
这个的结果显示走了索引
记录一下自己刚学到的一点点内容,可能还存在问题,不断更新吧~~