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

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

Mysql 5.6 "隱式轉(zhuǎn)換"導(dǎo)致的索引失效和數(shù)據(jù)不準(zhǔn)確的問題

瀏覽:154日期:2023-10-08 09:52:36

背景

在一次進(jìn)行SQl查詢時(shí),我試著對where條件中vachar類型的字段去掉單引號(hào)查詢,這個(gè)時(shí)候發(fā)現(xiàn)這條本應(yīng)該很快的語句竟然很慢。這個(gè)varchar字段有一個(gè)復(fù)合索引。其中的總條數(shù)有58989,甚至不加單引號(hào)查出來的數(shù)據(jù)不是我們想要的數(shù)據(jù)。 使用的是mysql 5.6版本,innoDB引擎 實(shí)際情況如下

下面我們來看一下執(zhí)行的結(jié)果

Mysql 5.6 "隱式轉(zhuǎn)換"導(dǎo)致的索引失效和數(shù)據(jù)不準(zhǔn)確的問題

在上面的描述中我們還得注意就是,你的where條件的字符串不加單引號(hào)必須是全數(shù)字。不然就會(huì)報(bào)錯(cuò)

Mysql 5.6 "隱式轉(zhuǎn)換"導(dǎo)致的索引失效和數(shù)據(jù)不準(zhǔn)確的問題

還有可能查出來的數(shù)據(jù)不是我們想要的數(shù)據(jù)。如下圖

Mysql 5.6 "隱式轉(zhuǎn)換"導(dǎo)致的索引失效和數(shù)據(jù)不準(zhǔn)確的問題

分析

從執(zhí)行結(jié)果來看,使用了單引號(hào)的走了對應(yīng)的索引。沒有使用單引號(hào)的沒有走索引,進(jìn)行了全表掃描。 為什么會(huì)這樣呢? mysql的優(yōu)化器怎么不直接進(jìn)行類型轉(zhuǎn)換呢? 在SQL語句中單引號(hào)的引入也就是代表這個(gè)類型是字符串?dāng)?shù)據(jù)類型CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM,和 SET。。 不加單引號(hào)也就代表這是一個(gè)字符串之外的類型,如int,bigDecimal類型等 如果給一串有字幕和特殊符號(hào)的字符串不加單引號(hào),后果就是類型轉(zhuǎn)換失敗導(dǎo)致SQl不能執(zhí)行。

如上圖所述:

1054 - Unknown column ’000w1993521’ in ’where clause’, Time: 0.008000s

我們先來看一下一條SQL的執(zhí)行過程

Mysql 5.6 "隱式轉(zhuǎn)換"導(dǎo)致的索引失效和數(shù)據(jù)不準(zhǔn)確的問題

(網(wǎng)圖)

我們先得出結(jié)論:如果對索引字段做函數(shù)操作(本例是cast函數(shù)做了隱式的轉(zhuǎn)換),可能會(huì)破壞索引值的有序性,因此優(yōu)化器就決定放棄走樹搜索功能。(https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html) [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-l5AwT0xu-1607244327891)(http://note.youdao.com/yws/res/23689/CE6F785994E6476D816B23787CE65217)] 意思也就是:請注意,如果您使用BINARY,CAST()或CONVERT()轉(zhuǎn)換索引列,則MySQL可能無法有效使用索引。 查出來的數(shù)據(jù)不準(zhǔn)確,也是因?yàn)殡[式轉(zhuǎn)換,轉(zhuǎn)換后導(dǎo)致數(shù)值類型不一樣,導(dǎo)致不等變?yōu)橄嗟取?

隱式轉(zhuǎn)換

1. 產(chǎn)生條件當(dāng)操作符與不同類型的操作數(shù)一起使用時(shí),會(huì)發(fā)生類型轉(zhuǎn)換以使操作數(shù)兼容。則會(huì)發(fā)生轉(zhuǎn)換隱式發(fā)生隱式轉(zhuǎn)換的條件:

兩個(gè)參數(shù)至少有一個(gè)是 NULL 時(shí),比較的結(jié)果也是 NULL,例外是使用 <=> 對兩個(gè) NULL 做比較時(shí)會(huì)返回 1,這兩種情況都不需要做類型轉(zhuǎn)換 兩個(gè)參數(shù)都是字符串,會(huì)按照字符串來比較,不做類型轉(zhuǎn)換 兩個(gè)參數(shù)都是整數(shù),按照整數(shù)來比較,不做類型轉(zhuǎn)換 十六進(jìn)制的值和非數(shù)字做比較時(shí),會(huì)被當(dāng)做二進(jìn)制串 有一個(gè)參數(shù)是 TIMESTAMP 或 DATETIME,并且另外一個(gè)參數(shù)是常量,常量會(huì)被轉(zhuǎn)換為 timestamp 有一個(gè)參數(shù)是 decimal 類型,如果另外一個(gè)參數(shù)是 decimal 或者整數(shù),會(huì)將整數(shù)轉(zhuǎn)換為 decimal 后進(jìn)行比較,如果另外一個(gè)參數(shù)是浮點(diǎn)數(shù),則會(huì)把 decimal 轉(zhuǎn)換為浮點(diǎn)數(shù)進(jìn)行比較 所有其他情況下,兩個(gè)參數(shù)都會(huì)被轉(zhuǎn)換為浮點(diǎn)數(shù)再進(jìn)行比較

2. 分析實(shí)際遇到的情況

1.那我們也就清楚了,上面我提出的例子是整數(shù)和字符串的比較,那就屬于其他情況了。那我們就先來分析一下索引失效的原因

由于屬于隱式轉(zhuǎn)換的其他情況,所以對比值都得轉(zhuǎn)換為浮點(diǎn)數(shù)進(jìn)行比較 我們先將查詢條件值進(jìn)行轉(zhuǎn)換為浮點(diǎn)數(shù),再著將表的記錄值也得進(jìn)行轉(zhuǎn)換,所以這個(gè)時(shí)候此前已經(jīng)創(chuàng)建好的索引排序已經(jīng)不能生效了。因?yàn)殡[式轉(zhuǎn)換(函數(shù))已經(jīng)改變了原來的值,所以說優(yōu)化器在這里就直接不選用索引,直接使用全表掃描。

2.查詢出不匹配的值(或者說是部分匹配的值),如上面的查詢結(jié)果。這真得看看源碼了,這也就是MYsql的隱式轉(zhuǎn)換規(guī)則。這里不就細(xì)分析了(因?yàn)闆]有查到相關(guān)的文檔)由于歷史原因,需要兼容舊的設(shè)計(jì),可以使用 MySQL 的類型轉(zhuǎn)換函數(shù) cast 和 convert,來明確的進(jìn)行轉(zhuǎn)換。總結(jié)

隱式轉(zhuǎn)換和函數(shù)的使用會(huì)導(dǎo)致索引失效和select出的數(shù)據(jù)不準(zhǔn)確 隱式轉(zhuǎn)換的發(fā)生條件以及規(guī)則 隱式轉(zhuǎn)換導(dǎo)致索引失效的具體原因,由于需要將對比值都要進(jìn)行類型轉(zhuǎn)換導(dǎo)致失效。 避免發(fā)生隱式類型轉(zhuǎn)換,隱式轉(zhuǎn)換的類型主要有字段類型不一致、in 參數(shù)包含多個(gè)類型、字符集類型或校對規(guī)則不一致等

參考https://dev.mysql.com/doc/refman/5.7/en/type-conversion.htmlhttps://xiaomi-info.github.io/2019/12/24/mysql-implicit-conversion/https://zhuanlan.zhihu.com/p/95170837

到此這篇關(guān)于Mysql 5.6 “隱式轉(zhuǎn)換”導(dǎo)致的索引失效和數(shù)據(jù)不準(zhǔn)確的問題的文章就介紹到這了,更多相關(guān)Mysql 5.6隱式轉(zhuǎn)換導(dǎo)致的索引失效內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 山东螺杆空压机,烟台空压机,烟台开山空压机-烟台开山机电设备有限公司 | 粉末包装机,拆包机厂家,价格-上海强牛包装机械设备有限公司 | 万师讲师网-优质讲师培训师供应商,讲师认证,找讲师来万师 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 上海平衡机-单面卧式动平衡机-万向节动平衡机-圈带动平衡机厂家-上海申岢动平衡机制造有限公司 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 有源电力滤波装置-电力有源滤波器-低压穿排电流互感器|安科瑞 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 美侍宠物-专注宠物狗及宠物猫训练|喂养|医疗|繁育|品种|价格 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 领袖户外_深度旅游、摄影旅游、小团慢旅行、驴友网 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 广州昊至泉水上乐园设备有限公司| 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 脉冲除尘器,除尘器厂家-淄博机械 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 庭院灯_太阳能景观灯_草坪灯厂家_仿古壁灯-重庆恒投科技 | 国标白水泥,高标号白水泥,白水泥厂家-淄博华雪建材有限公司 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 短信群发平台_群发短信软件_短信营销-讯鸽科技 | 隧道烘箱_隧道烘箱生产厂家-上海冠顶专业生产烘道设备 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 沥青灌缝机_路面灌缝机_道路灌缝机_沥青灌缝机厂家_济宁萨奥机械有限公司 | 广东青藤环境科技有限公司-水质检测 | 杭州营业执照代办-公司变更价格-许可证办理流程_杭州福道财务管理咨询有限公司 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 防爆电机_防爆电机型号_河南省南洋防爆电机有限公司 | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 合同书格式和范文_合同书样本模板_电子版合同,找范文吧 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 冷库安装厂家_杭州冷库_保鲜库建设-浙江克冷制冷设备有限公司 |