mysql索引遇到的问题

前提:sql所用到的表为sakila表结构,有现成的建库语句。

1.

1.explain select * from rental where rental_date>'2005-05-23 22:53:30';
2.explain select rental_date from rental where rental_date>'2005-05-23 22:53:30';

执行后1没有用到索引,2用到了索引
结论1:不一定建了该列的索引,且where后缀有该列就一定会用到索引。mysql内部会看哪种效率高,一种用到索引,但需要回表查,一种用不到索引,但不需要回表查,哪种快用哪种。

2.

explain select rental_date from rental 
where rental_date>'2005-05-23 22:53:30' order by rental_date,inventory_id;

在这里插入图片描述
结论2:order by 时,尽量用到索引,因为一句select sql的执行顺序为select出结果,然后排序,排序时会看之前select有没有用到索引,如果用了,则直接用索引排序,如果没有用到,则自行排序,extra会出现如下的提示:
在这里插入图片描述而这种操作会非常耗时。如果要保证order by用到索引,需要保证order by 后面跟的必须满足索引最左前缀,或者(where子句中或者join子句对索引指定了常量)

3.

-- 1语句
explain select actor_id,title from film_actor inner join film using(film_id) order by actor_id
-- 2语句 与 1语句执行结果相同,均用到Using filesort,
explain select actor_id,title from film inner join film_actor using(film_id) order by actor_id
-- 3没有用到filesort,直接通过索引排序。
explain select actor_id,title from film_actor inner join film using(film_id) where actor_id<3 order by actor_id

语句1和语句2执行结果:
在这里插入图片描述
语句3执行结果:
在这里插入图片描述
结论3:两表join时,只有当order by子句引用的字段全为第一个表(意思为驱动表)时,才会通过索引排序,否则还是会进行filesort,但语句一和语句2为何都不索引排序呢,因为film中有1000条数据,film_actor中有4000条数据,mysql会内部优化小表驱动大表,所以actor_id就不是驱动表的字段,所以不能索引排序,语句3种,首先过滤了一下film_actor表,所以film_actor就成为了小表,所以film_actor为驱动表,所以actor_id为驱动表字段,所以走了索引排序。

4.

-- 语句1
select * from profiles1 PROFILES where sex='M' order by rating limit 100000,10;
-- 语句2
select * from profiles1 inner join(
select id from profiles1 b where sex='M' order by rating limit 100000,10
) a on profiles1.id=a.id;

执行结果:
在这里插入图片描述
在这里插入图片描述
结论4:遇到这种大型分页问题,可以用到覆盖索引,来延迟关联,语句1中虽然使用到了联合索引,但是每次都要回表查询所有的数据,回100000次表用的时间不长才怪,语句2中,因为子查询只查询了id,不用回表,就可以得到那10个id,然后小表驱动大表,查询10次,第一个总共的查询为 走索引+通过id回表10000次,第二个为走索引+回表10次,速度自然相差甚大

持续更新ing…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值