MySQL索引不會(huì)被用到的情況匯總
MySQL中索引的類型
一般可分為四類:
- 普通索引:最普通的索引
- 唯一索引:索引列的值必須唯一,但允許有空值
- 主鍵索引:一種特殊的唯一索引,不允許有空值
- 聯(lián)合索引:索引列有多個(gè)字段,使用時(shí)需要滿足最左前綴原則
普通索引
這是最基本的索引,它沒有任何限制。它有以下幾種創(chuàng)建方式:
1.創(chuàng)建索引
代碼如下:
CREATE INDEX indexName ON mytable(username(length));
如果是 CHAR,VARCHAR 類型,length 可以小于字段實(shí)際長(zhǎng)度;如果是 BLOB 和 TEXT 類型,必須指定 length,下同。
2.修改表結(jié)構(gòu)
代碼如下:
ALTER mytable ADD INDEX [indexName] ON (username(length))
創(chuàng)建表的時(shí)候直接指定
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)建表的時(shí)候直接指定:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
主鍵索引
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時(shí)候同時(shí)創(chuàng)建主鍵索引:
代碼如下:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
當(dāng)然也可以用 ALTER 命令。記?。阂粋€(gè)表只能有一個(gè)主鍵。
聯(lián)合索引
為了形象地對(duì)比單列索引和組合索引,為表添加多個(gè)字段:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );
為了進(jìn)一步榨取 MySQL 的效率,就要考慮建立組合索引。就是將 name, city, age 建到一個(gè)索引里:
代碼如下:
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);
索引用不上的情況
索引不是每次都可以生效的,如果我們操作不對(duì),那么很有可能是走全表掃描而不是走的索引,Explain 中的 possible_key、key_len 以及 key 參數(shù)都可以分析我們的 SQL 語句是否用到了索引。
以下情況將會(huì)導(dǎo)致索引失效
- 查詢的列中使用了 != 比如 select id,name,age from student where id != 2;
- 查詢的列中使用了函數(shù)操作,比如 pow(id,2) 對(duì) id 做平方這種函數(shù)表達(dá)式,也不會(huì)用到索引
- 如果條件中有 or,即使其中有部分條件帶索引也不會(huì)使用(這也是為什么盡量少用or的原因)
- 聯(lián)合索引中即使?jié)M足最左前綴原則,但是第一個(gè)條件帶了范圍查詢,那么也不會(huì)用到索引
- 存在索引列的數(shù)據(jù)類型隱形轉(zhuǎn)換,則用不上索引,比如列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號(hào)引用起來,否則不使用索引
- 如果 MySQL 估計(jì)使用全表掃描要比使用索引快,則不使用索引
以上都可以使用 Explain 進(jìn)行測(cè)試是否用到了索引。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
關(guān)于mysql 8.x 中insert ignore的性能問題
這篇文章主要介紹了關(guān)于mysql 8.x 中insert ignore的性能問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-08-08
在Linux系統(tǒng)的命令行中為MySQL創(chuàng)建用戶的方法
這篇文章主要介紹了在Linux系統(tǒng)的命令行中為MySQL創(chuàng)建用戶的方法,包括對(duì)所建用戶的權(quán)限管理,需要的朋友可以參考下2015-06-06
MySQL插入時(shí)間戳字段的值實(shí)現(xiàn)
在MySQL中,我們經(jīng)常會(huì)遇到需要插入時(shí)間戳字段的情況,包括使用NOW()函數(shù)插入當(dāng)前時(shí)間戳,使用FROM_UNIXTIME()插入指定時(shí)間戳,本文就來介紹一下,感興趣的可以了解一下2024-09-09
使用mysql workbench自動(dòng)生成ER圖的實(shí)現(xiàn)步驟
MySQL Workbench是一款專為MySQL設(shè)計(jì)的ER/數(shù)據(jù)庫(kù)建模工具,它是著名的數(shù)據(jù)庫(kù)設(shè)計(jì)工具DBDesigne4的繼任者,可以通過MySQL Workbench設(shè)計(jì)和創(chuàng)建新的數(shù)據(jù)庫(kù)圖示,本文給大家介紹了使用mysql workbench自動(dòng)生成ER圖的實(shí)現(xiàn)步驟,需要的朋友可以參考下2024-06-06
mysql滑動(dòng)聚合/年初至今聚合原理與用法實(shí)例分析
這篇文章主要介紹了mysql滑動(dòng)聚合原理與用法,結(jié)合實(shí)例形式分析了mysql滑動(dòng)聚合的相關(guān)功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-12-12
關(guān)于MySQL表中沒有主鍵時(shí)如何找到重復(fù)的數(shù)據(jù)
這篇文章主要來和探討一下關(guān)于MySQL表中沒有主鍵時(shí),該如何找到重復(fù)的數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下2023-06-06
MySQL使用xtrabackup進(jìn)行備份還原操作
這篇文章主要為大家詳細(xì)介紹了MySQL如何使用xtrabackup進(jìn)行備份還原操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
修改mysql默認(rèn)字符集的兩種方法詳細(xì)解析
下面小編就為大家介紹兩種修改mysql默認(rèn)字符集的方法。需要的朋友可以過來參考下2013-08-08

