五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

淺談MySql整型索引和字符串索引失效或隱式轉(zhuǎn)換問題

發(fā)布日期:2021-12-09 11:22 | 文章來源:源碼之家

問題概述

今天在上班時,DBA突然找出來一段sql,表示該sql存在隱式轉(zhuǎn)換,不走索引。經(jīng)過我們的查看后,發(fā)現(xiàn)是類型varchar的字段, 我們使用條件傳入了數(shù)值型的值,由于擔心違反保密協(xié)議,在此就不貼圖了,由我重現(xiàn)一下類似情況給大家看一下。

問題重現(xiàn)

首先我們先創(chuàng)建一張用戶表test_user,其中USER_ID為了效果我們設置為varchar類型且加上唯一索引。

CREATE TABLE test_user (
  ID int(11) NOT NULL AUTO_INCREMENT,
  USER_ID varchar(11) DEFAULT NULL COMMENT '用戶賬號',
  USER_NAME varchar(255) DEFAULT NULL COMMENT '用戶名',
  AGE int(5) DEFAULT NULL COMMENT '年齡',
  COMMENT varchar(255) DEFAULT NULL COMMENT '簡介',
  PRIMARY KEY (ID)
  UNIQUE KEY UNIQUE_USER_ID (USER_ID) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表格數(shù)據(jù)如下(嘻嘻 數(shù)據(jù)依舊使用與上次Mysql的文章MySQL使用UNION連接兩個查詢排序失效相同的數(shù)據(jù),但是要注意表結構不同。)

ID USER_ID USER_NAME AGE COMMENT
1 111 開心菜鳥 18 今天很開心
2 222 悲傷菜鳥 21 今天很悲傷
3 333 認真菜鳥 30 今天很認真
4 444 高興菜鳥 18 今天很高興
5 555 嚴肅菜鳥 21 今天很嚴肅

接下來我們執(zhí)行以下sql

EXPLAIN SELECT * FROM test_user WHERE USER_ID = 111;

發(fā)現(xiàn)給出的解釋結果如下:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE test_user ALL 5 Using where

我們給條件加上引號后再解釋以下:

EXPLAIN SELECT * FROM test_user WHERE USER_ID = '111';

這時候我們發(fā)現(xiàn)varchar類型的字段在作為字符串查詢的時候使用了索引,在以數(shù)值類型進行查詢時是不使用索引的。

問題引申

那么問題來了,如果字段是整型的且加上索引,以字符串查詢時會不會也不走索引呢?實踐出真知,讓我們再接著往下測試一下。

-- 將USER_ID的類型修改為整型
CREATE TABLE test_user (
  ID int(11) NOT NULL AUTO_INCREMENT,
  USER_ID int(11) DEFAULT NULL COMMENT '用戶賬號',
  USER_NAME varchar(255) DEFAULT NULL COMMENT '用戶名',
  AGE int(5) DEFAULT NULL COMMENT '年齡',
  COMMENT varchar(255) DEFAULT NULL COMMENT '簡介',
  PRIMARY KEY (ID),
  UNIQUE KEY UNIQUE_USER_ID (USER_ID) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
EXPLAIN SELECT * FROM test_user WHERE USER_ID = 111;
EXPLAIN SELECT * FROM test_user WHERE USER_ID = '111';

在執(zhí)行了上面兩個語句后我們發(fā)現(xiàn),int類型的字段無論是以字符串查詢還是以數(shù)值型查詢都會走索引。

結論

  1. 當我們使用的字段是數(shù)值類型時,加引號或者不加引號(sql中單引號和雙引號實現(xiàn)相同效果)都不影響索引的使用
  2. 當我們的字段是字符串類型時,不加引號的查詢無法使用索引,加引號的查詢才可正常使用索引

綜上所述,我認為以后寫sql的時候注意最好都加上引號,避免這種字符串類型的不走索引的情況發(fā)生,更深層次的原理需要再挖掘一下,如果大家有什么意見可以探討一下。

到此這篇關于淺談MySql整型索引和字符串索引失效或隱式轉(zhuǎn)換問題的文章就介紹到這了,更多相關MySql整型索引和字符串索引失效內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!

版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部