国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

導(dǎo)致MySQL做全表掃描的幾種情況

瀏覽:4日期:2023-10-04 14:31:20

這兩天看到了兩種可能會(huì)導(dǎo)致全表掃描的sql,這里給大家看一下,希望可以避免踩坑:

情況1:

強(qiáng)制類型轉(zhuǎn)換的情況下,不會(huì)使用索引,會(huì)走全表掃描。

舉例如下:

首先我們創(chuàng)建一個(gè)表

CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `age` int(11) DEFAULT NULL, `score` varchar(20) NOT NULL DEFAULT ’’, PRIMARY KEY (`id`), KEY `idx_score` (`score`)) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8

我們可以看到,這個(gè)表有三個(gè)字段,其中兩個(gè)int類型,一個(gè)varchar類型。varchar類型的字段score是一個(gè)索引,而id是主鍵。

然后我們給這個(gè)表里面插入一些數(shù)據(jù),插入數(shù)據(jù)之后的表如下:

mysql:yeyztest 21:43:12>>select * from test;+----+------+-------+| id | age | score |+----+------+-------+| 1 | 1 | 5 || 2 | 2 | 10 || 5 | 5 | 25 || 8 | 8 | 40 || 9 | 2 | 45 || 10 | 5 | 50 || 11 | 8 | 55 |+----+------+-------+7 rows in set (0.00 sec)

這個(gè)時(shí)候,我們使用explain語句來查看兩條sql的執(zhí)行情況,分別是:

explain select * from test where score =’10’;explain select * from test where score =10;

結(jié)果如下:

mysql:yeyztest 21:42:29>>explain select * from test where score =’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 |+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+1 row in set, 1 warning (0.00 sec)mysql:yeyztest 21:43:06>>explain select * from test where score =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 | Using where |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+1 row in set, 3 warnings (0.00 sec)

可以看到,如果我們使用的是varchar類型的值,那么結(jié)果中掃描的行數(shù)rows就是1,而當(dāng)我們使用的是整數(shù)值10的時(shí)候,掃描行數(shù)變?yōu)榱?,證明,如果出現(xiàn)了強(qiáng)制類型轉(zhuǎn)換,則會(huì)導(dǎo)致索引失效。

情況2:

反向查詢不能使用索引,會(huì)導(dǎo)致全表掃描。

創(chuàng)建一個(gè)表test1,它的主鍵是score,然后插入6條數(shù)據(jù):

CREATE TABLE `test1` ( `score` varchar(20) not null default ’’ , PRIMARY KEY (`score`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mysql:yeyztest 22:09:37>>select * from test1;+-------+| score |+-------+| 111 || 222 || 333 || 444 || 555 || 666 |+-------+6 rows in set (0.00 sec)

當(dāng)我們使用反向查找的時(shí)候,不會(huì)使用到索引,來看下面兩條sql:

explain select * from test1 where score=’111’;explain select * from test1 where score!=’111’;

mysql:yeyztest 22:13:01>>explain select * from test1 where score=’111’;+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+| 1 | SIMPLE | test1 | NULL | const | PRIMARY | PRIMARY | 62 | const | 1 | 100.00 | Using index |+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)mysql:yeyztest 22:13:08>>explain select * from test1 where score!=’111’;+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+| 1 | SIMPLE | test1 | NULL | index | PRIMARY | PRIMARY | 62 | NULL | 6 | 100.00 | Using where; Using index |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+1 row in set, 1 warning (0.00 sec)

可以看到,使用!=作為條件的時(shí)候,掃描的行數(shù)是表的總記錄行數(shù)。因此如果想要使用索引,我們就不能使用反向匹配規(guī)則。

情況3:

某些or值條件可能導(dǎo)致全表掃描。

首先我們創(chuàng)建一個(gè)表,并插入幾條數(shù)據(jù):

CREATE TABLE `test4` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, KEY `idx_id` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)[email protected]:yeyztest 22:23:44>>select * from test4;+------+------+| id | name |+------+------+| 1 | aaa || 2 | bbb || 3 | ccc || 4 | yeyz || NULL | yeyz |+------+------+5 rows in set (0.00 sec)

其中表test4包含兩個(gè)字段,id字段是一個(gè)索引,而name字段是varchar類型,我們來看下面三個(gè)語句的掃描行數(shù):

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;

mysql:yeyztest 22:24:12>>explain select * from test4 where id is null;+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-----------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-----------------------+| 1 | SIMPLE | test4 | NULL | ref | idx_id| idx_id | 5 | const | 1 | 100.00 | Using index condition |+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-----------------------+1 row in set, 1 warning (0.00 sec)mysql:yeyztest 22:24:17>>explain select * from test4 where id=1; +----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+| 1 | SIMPLE | test4 | NULL | ref | idx_id| idx_id | 5 | const | 1 | 100.00 | NULL |+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+1 row in set, 1 warning (0.00 sec)mysql:yeyztest 22:24:28>>explain select * from test4 where id=1 or id is null;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+| 1 | SIMPLE | test4 | NULL | ALL | idx_id| NULL | NULL | NULL | 5 | 40.00 | Using where |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)

可以看到單獨(dú)使用id=1和id is null,都只會(huì)掃描一行記錄,而使用or將二者連接起來就會(huì)導(dǎo)致掃描全表而不使用索引。

簡(jiǎn)單總結(jié)一下:

1.強(qiáng)制類型轉(zhuǎn)換的情況下,不會(huì)使用索引,會(huì)走全表掃描

2.反向查詢不能使用索引,會(huì)導(dǎo)致全表掃描。

3.某些or值條件可能導(dǎo)致全表掃描。

以上就是導(dǎo)致MySQL做全表掃描的幾種情況的詳細(xì)內(nèi)容,更多關(guān)于MySQL 全表掃描的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
相關(guān)文章:
主站蜘蛛池模板: 免费特黄一级欧美大片在线看 | 黄色毛片一级 | 欧美日韩亚洲另类 | 男女男精品视频在线播放 | 国产日韩精品一区二区三区 | 中文字幕s级优女区 | 加勒比一本一道在线 | 在线小毛片 | 亚洲第十色 | 亚洲国产第一 | 成人久久18免费网站游戏 | 久久久久久一级毛片免费野外 | 在线观看亚洲网站 | 亚洲gogo人体大胆西西安徽 | 久久中文字幕免费视频 | 72种姿势欧美久久久久大黄蕉 | 国产最新精品 | 精品久久久在线观看 | 99在线视频网站 | 国产一级做a爰片在线 | 欧美日本在线三级视频 | 日本无遮 | 久久经典免费视频 | 成人 在线欧美亚洲 | 国产成人精品一区二三区2022 | 在线a视频网站 | 日本欧美韩国一区二区三区 | 99在线观看视频 | 日本污污网站 | 欧美视频免费一区二区三区 | 精品国产一区二区在线观看 | 欧美成人高清手机在线视频 | 中文字幕一区日韩在线视频 | 亚洲高清在线观看看片 | 美女扒开腿让男人桶尿口 | 免费视频日本 | 国内真实愉拍系列情侣 | 精品亚洲视频在线 | 精品久久久久久国产免费了 | 成人精品一区二区不卡视频 | 成年视频在线 |