濮阳杆衣贸易有限公司

主頁 > 知識庫 > MySQL索引不會被用到的情況匯總

MySQL索引不會被用到的情況匯總

熱門標簽:真人語音電話機器人 騰訊地圖標注提升 400電話可以免費申請嗎 美國反騷擾電話機器人 電銷卡外呼系統(tǒng)供應(yīng)商 悟空科技電話機器人 福建外呼系統(tǒng)定制化 怎么在地圖標注位置生成圖片 銅陵防封電銷卡

MySQL中索引的類型

一般可分為四類:

  • 普通索引:最普通的索引
  • 唯一索引:索引列的值必須唯一,但允許有空值
  • 主鍵索引:一種特殊的唯一索引,不允許有空值
  • 聯(lián)合索引:索引列有多個字段,使用時需要滿足最左前綴原則

普通索引

這是最基本的索引,它沒有任何限制。它有以下幾種創(chuàng)建方式:

1.創(chuàng)建索引

代碼如下:

CREATE INDEX indexName ON mytable(username(length));

如果是 CHAR,VARCHAR 類型,length 可以小于字段實際長度;如果是 BLOB 和 TEXT 類型,必須指定 length,下同。

2.修改表結(jié)構(gòu)

代碼如下:

ALTER mytable ADD INDEX [indexName] ON (username(length))

創(chuàng)建表的時候直接指定

CREATE TABLE mytable(
 ID INT NOT NULL,
 username VARCHAR(16) NOT NULL,
 INDEX [indexName] (username(length))
);

刪除索引的語法:

DROP INDEX [indexName] ON mytable;

唯一索引

它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創(chuàng)建方式:

CREATE UNIQUE INDEX indexName ON mytable(username(length))

修改表結(jié)構(gòu):

ALTER mytable ADD UNIQUE [indexName] ON (username(length))

創(chuàng)建表的時候直接指定:

CREATE TABLE mytable(  
	ID INT NOT NULL,  
	username VARCHAR(16) NOT NULL,  
	UNIQUE [indexName] (username(length))  
);

主鍵索引

它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創(chuàng)建主鍵索引:

代碼如下:

CREATE TABLE mytable(  
	ID INT NOT NULL,  
	username VARCHAR(16) NOT NULL,  
	PRIMARY KEY(ID) 
);

當然也可以用 ALTER 命令。記?。阂粋€表只能有一個主鍵。

聯(lián)合索引

為了形象地對比單列索引和組合索引,為表添加多個字段:

CREATE TABLE mytable(  
	ID INT NOT NULL,  
	username VARCHAR(16) NOT NULL,  
	city VARCHAR(50) NOT NULL,  
	age INT NOT NULL 
);

為了進一步榨取 MySQL 的效率,就要考慮建立組合索引。就是將 name, city, age 建到一個索引里:

代碼如下:

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);

索引用不上的情況

索引不是每次都可以生效的,如果我們操作不對,那么很有可能是走全表掃描而不是走的索引,Explain 中的 possible_key、key_len 以及 key 參數(shù)都可以分析我們的 SQL 語句是否用到了索引。

以下情況將會導致索引失效

  1. 查詢的列中使用了 != 比如 select id,name,age from student where id != 2;
  2. 查詢的列中使用了函數(shù)操作,比如 pow(id,2) 對 id 做平方這種函數(shù)表達式,也不會用到索引
  3. 如果條件中有 or,即使其中有部分條件帶索引也不會使用(這也是為什么盡量少用or的原因)
  4. 聯(lián)合索引中即使?jié)M足最左前綴原則,但是第一個條件帶了范圍查詢,那么也不會用到索引
  5. 存在索引列的數(shù)據(jù)類型隱形轉(zhuǎn)換,則用不上索引,比如列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號引用起來,否則不使用索引
  6. 如果 MySQL 估計使用全表掃描要比使用索引快,則不使用索引

以上都可以使用 Explain 進行測試是否用到了索引。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • mysql索引使用率監(jiān)控技巧(值得收藏?。?/li>
  • 當Mysql行鎖遇到復(fù)合主鍵與多列索引詳解
  • MySQL查詢條件中in會用到索引嗎
  • mysql索引對排序的影響實例分析
  • MySQL如何修改賬號的IP限制條件詳解
  • MySQL分區(qū)表的局限和限制詳解
  • mysql查詢語句通過limit來限制查詢的行數(shù)
  • MySQL連接數(shù)超過限制的解決方法
  • MySQL索引長度限制原理解析

標簽:烏海 臨汾 武威 云浮 湖南 白銀 湖北 聊城

巨人網(wǎng)絡(luò)通訊聲明:本文標題《MySQL索引不會被用到的情況匯總》,本文關(guān)鍵詞  MySQL,索引,不,會被,用到,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL索引不會被用到的情況匯總》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL索引不會被用到的情況匯總的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    镇江市| 河间市| 化德县| 蓝田县| 莱西市| 贡山| 黄龙县| 鲁甸县| 张家界市| 天门市| 枞阳县| 巨鹿县| 长顺县| 五寨县| 周至县| 龙海市| 类乌齐县| 垦利县| 阳江市| 顺平县| 孟津县| 山阴县| 利津县| 观塘区| 抚宁县| 潜山县| 泾阳县| 临潭县| 宝坻区| 磴口县| 宁津县| 阳谷县| 封丘县| 即墨市| 赤城县| 井陉县| 黔东| 荆门市| 饶河县| 申扎县| 肇源县|