导致MySQL做全表扫描的几种情况
16lz
2021-12-12
情况1:
强制类型转换的情况下,不会使用索引,会走全表扫描。
举例如下:
首先我们创建一个表
CREATETABLE`test`(`id`int(11)NOTNULLAUTO_INCREMENT,`age`int(11)DEFAULTNULL,`score`varchar(20)NOTNULLDEFAULT'',PRIMARYKEY(`id`),KEY`idx_score`(`score`))ENGINE=InnoDBAUTO_INCREMENT=12DEFAULTCHARSET=utf8
然后我们给这个表里面插入一些数据,插入数据之后的表如下:
mysql:yeyztest 21:43:12>>select*fromtest;+----+------+-------+|id|age|score|+----+------+-------+|1|1|5||2|2|10||5|5|25||8|8|40||9|2|45||10|5|50||11|8|55|+----+------+-------+7rowsinset(0.00sec)
explain select * from test where score ='10';explain select * from test where score =10;
mysql:yeyztest21:42:29>>explainselect*fromtestwherescore='10';+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+|1|SIMPLE|test|NULL|ref|idx_score|idx_score|62|const|1|100.00|NULL|+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+1rowinset,1warning(0.00sec)mysql:yeyztest21:43:06>>explainselect*fromtestwherescore=10;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+|1|SIMPLE|test|NULL|ALL|idx_score|NULL|NULL|NULL|7|14.29|Usingwhere|+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+1rowinset,3warnings(0.00sec)
情况2:
反向查询不能使用索引,会导致全表扫描。
创建一个表test1,它的主键是score,然后插入6条数据:
CREATETABLE`test1`(`score`varchar(20) not null default '' ,PRIMARYKEY(`score`))ENGINE=InnoDBDEFAULTCHARSET=utf8mysql:yeyztest22:09:37>>select*fromtest1;+-------+|score|+-------+|111||222||333||444||555||666|+-------+6rowsinset(0.00sec)
explain select * from test1 where score='111';explain select * from test1 where score!='111';
情况3:
某些or值条件可能导致全表扫描。
首先我们创建一个表,并插入几条数据:
CREATETABLE`test4`(`id`int(11)DEFAULTNULL,`name`varchar(20)DEFAULTNULL,KEY`idx_id`(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf81rowinset(0.00sec)mysql--dba_admin@127.0.0.1:yeyztest22:23:44>>select*fromtest4;+------+------+|id|name|+------+------+|1|aaa||2|bbb||3|ccc||4|yeyz||NULL|yeyz|+------+------+5rowsinset(0.00sec)
explain select * from test4 where id=1;explain select * from test4 where id is null;explain select * from test4 where id=1 or id is null;
简单总结一下:
1.强制类型转换的情况下,不会使用索引,会走全表扫描
2.反向查询不能使用索引,会导致全表扫描。
3.某些or值条件可能导致全表扫描。
更多相关文章
- Android上的模拟点击
- Android(安卓)获取存储卡路径和空间使用情况
- Error:Uncaught translation error: com.android.dx.cf.code.Sim
- Android(安卓)后台线程调用前台线程的几种方法
- 我今天的面试题,注册广播有几种方式,这些方式有何优缺点?请谈谈Andr
- Android(安卓)代码设置Color的几种方式
- JS判断终端类型的几种方法
- 查看基于Android(安卓)系统单个进程内存、CPU使用情况的几种方法
- Android中的几种网络请求方式详解