MySQL的索引

为什么要索引?
	索引可以帮助我们更快的查询
	每个字段都可以加索引
索引的不好之处
	所以也要耗费内存,所以索引不宜过多
	对于经常作为查询条件的字段,加索引
	因为索引利于增加查询速率,因为一般索引加到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;
		这个的结果显示走了索引

记录一下自己刚学到的一点点内容,可能还存在问题,不断更新吧~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值