电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

情況1:

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

舉例如下:

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

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

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

然后我們給這個表里面插入一些數(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)

這個時候,我們使用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ù)變?yōu)榱?,證明,如果出現(xiàn)了強(qiáng)制類型轉(zhuǎn)換,則會導(dǎo)致索引失效。

情況2:

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

創(chuàng)建一個表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)我們使用反向查找的時候,不會使用到索引,來看下面兩條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ù)。因此如果想要使用索引,我們就不能使用反向匹配規(guī)則。

情況3:

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

首先我們創(chuàng)建一個表,并插入幾條數(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)mysql--dba_admin@127.0.0.1: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包含兩個字段,id字段是一個索引,而name字段是varchar類型,我們來看下面三個語句的掃描行數(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,都只會掃描一行記錄,而使用or將二者連接起來就會導(dǎo)致掃描全表而不使用索引。

簡單總結(jié)一下:

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

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

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

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

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 智能门锁电机_智能门锁离合器_智能门锁电机厂家-温州劲力智能科技有限公司 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 碳刷_刷握_集电环_恒压簧_电刷厂家-上海丹臻机电科技有限公司 | 广东机电安装工程_中央空调工程_东莞装饰装修-广东粤标建设有限公司 | nalgene洗瓶,nalgene量筒,nalgene窄口瓶,nalgene放水口大瓶,浙江省nalgene代理-杭州雷琪实验器材有限公司 | 自动钻孔机-全自动数控钻孔机生产厂家-多米(广东)智能装备有限公司 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 恒温油槽-恒温水槽-低温恒温槽厂家-宁波科麦仪器有限公司 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 螺杆泵_中成泵业| 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 山东螺杆空压机,烟台空压机,烟台开山空压机-烟台开山机电设备有限公司 | 国际线缆连接网 - 连接器_线缆线束加工行业门户网站 | 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 断桥铝破碎机_发动机破碎机_杂铝破碎机厂家价格-皓星机械 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 工业淬火油烟净化器,北京油烟净化器厂家,热处理油烟净化器-北京众鑫百科 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 西安微信朋友圈广告投放_微信朋友圈推广_西安度娘网络科技有限公司 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 企业微信scrm管理系统_客户关系管理平台_私域流量运营工具_CRM、ERP、OA软件-腾辉网络 | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | 月嫂_保姆_育婴_催乳_母婴护理_产后康复_养老护理-吉祥到家家政 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 礼堂椅厂家|佛山市艺典家具有限公司 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 硅胶制品-硅橡胶制品-东莞硅胶制品厂家-广东帝博科技有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 |