新聞中心
MySQL是一種非常流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。它不僅支持大規(guī)模數(shù)據(jù)存儲(chǔ),還具有高性能和可擴(kuò)展性等優(yōu)點(diǎn)。在MySQL中,索引是一種非常重要的數(shù)據(jù)結(jié)構(gòu),它能夠幫助我們快速地查找和訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù)。本文將介紹如何查看MySQL的所有索引,以便于管理和優(yōu)化數(shù)據(jù)庫(kù)性能。

成都創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營(yíng)銷推廣、網(wǎng)站重做改版、鶴城網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、購(gòu)物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為鶴城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
一、使用SHOW INDEXES語(yǔ)句
MySQL提供了SHOW INDEXES語(yǔ)句來(lái)顯示表中的所有索引信息。其語(yǔ)法如下:
SHOW INDEXES FROM 表名 [WHERE 條件];
其中,表名是需要查看索引的表名稱,條件是可選參數(shù),用于過(guò)濾所顯示的索引信息。執(zhí)行該語(yǔ)句后,將顯示以下信息:
1、表的名稱;
2、索引名稱;
3、索引類型;
4、索引的字段名稱;
5、索引的順序;
6、唯一性;
7、當(dāng)索引被創(chuàng)建時(shí)使用的方法;
8、索引占用的空間大小;
9、注釋。
例如,我們可以使用以下命令查看MySQL中employees表的所有索引信息:
SHOW INDEXES FROM employees;
二、使用information_schema數(shù)據(jù)庫(kù)
information_schema是MySQL中的一個(gè)特殊數(shù)據(jù)庫(kù),它包含了許多有用的關(guān)于MySQL數(shù)據(jù)庫(kù)的元數(shù)據(jù)信息。這些元數(shù)據(jù)信息包括了表信息、索引信息、用戶信息、表空間信息等等。使用information_schema數(shù)據(jù)庫(kù)可以直接查詢數(shù)據(jù)庫(kù)中的元數(shù)據(jù)信息,方便數(shù)據(jù)庫(kù)的管理和優(yōu)化。
我們可以使用以下語(yǔ)句查詢information_schema數(shù)據(jù)庫(kù)中的索引信息:
SELECT *
FROM information_schema.statistics
WHERE table_name = ‘表名’;
其中,table_name是需要查詢索引的表名稱,在上述查詢中,我們選擇了information_schema.statistics表。該表用于存儲(chǔ)MySQL數(shù)據(jù)庫(kù)中所有表的索引信息。執(zhí)行以上語(yǔ)句后,將會(huì)顯示表名、索引名、索引類型、索引占用的空間大小、非唯一索引的字段名等信息。
例如,我們可以使用以下命令查詢MySQL中employees表的所有索引信息:
SELECT *
FROM information_schema.statistics
WHERE table_name = ’employees’;
三、使用EXPLN語(yǔ)句
EXPLN語(yǔ)句是MySQL中用于優(yōu)化查詢的一個(gè)非常有用的工具。通過(guò)使用EXPLN語(yǔ)句,可以查看查詢中涉及到的所有索引信息。EXPLN語(yǔ)句會(huì)返回一張表格,其中包含了SQL查詢語(yǔ)句的執(zhí)行計(jì)劃詳細(xì)信息。
我們可以使用以下語(yǔ)句查詢MySQL中employees表中的索引信息:
EXPLN SELECT *
FROM employees
WHERE last_name = ‘ith’;
上述語(yǔ)句將查詢employees表中所有姓為ith的員工信息,并顯示SQL查詢語(yǔ)句執(zhí)行過(guò)程中所需要的所有索引信息。通過(guò)觀察返回的信息,我們可以發(fā)現(xiàn)是否存在需要優(yōu)化的索引。
以上三種方法都可以用于查看MySQL數(shù)據(jù)庫(kù)中的所有索引信息。使用SHOW INDEXES語(yǔ)句可以快速的顯示表中的所有索引信息,information_schema數(shù)據(jù)庫(kù)可以直接查詢各種元數(shù)據(jù)信息,而EXPLN語(yǔ)句則可以幫助我們優(yōu)化查詢以及查看索引使用情況。掌握這些技巧可以幫助開發(fā)者更好地管理和優(yōu)化MySQL數(shù)據(jù)庫(kù),提高系統(tǒng)的性能和穩(wěn)定性。
相關(guān)問(wèn)題拓展閱讀:
- mysql中如何查看和刪除唯一索引
- mysql索引有幾種
mysql中如何查看和刪除唯一索引
mysql中如燃森何查看和刪除唯一索引。
查看唯一索引:
show
index
from
mytable;//mytable
是表名
查詢結(jié)果如下:
查讓塵詢到唯一索引后,如何刪除唯一索引呢,使用如下命令:
皮滑畝 alter
table
mytable
drop
index
mdl_tag_use_ix;//mdl_tag_use_ix是上表查出的索引名,key_name
mysql索引有幾種
Mysql目前主要有以下幾種索引類型:FULLTEXT,HASH,REE,RTREE。
那么,這幾種索引有什么功能和性能上的不同呢?
FULLTEXT
即為全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過(guò)目前只有 CHAR、VARCHAR ,TEXT 列上可以創(chuàng)建全文索引。值得一提的是,在數(shù)據(jù)量較大時(shí)候,現(xiàn)將數(shù)據(jù)放入一個(gè)沒(méi)有全局索引的表中,然后再用CREATE INDEX創(chuàng)建FULLTEXT索引,要比先為一張表建立FULLTEXT然后再將數(shù)據(jù)寫入的速度快很多。
全文索引并不是和MyISAM一起誕生的,它的出現(xiàn)是為了解決WHERE name LIKE “%word%”這類針對(duì)文本的模糊查詢效率較低的問(wèn)題。在沒(méi)有全文索引之前,這樣一個(gè)查詢語(yǔ)句是要進(jìn)行遍歷數(shù)據(jù)表操作的,可見,在數(shù)據(jù)量較大時(shí)是極其的耗時(shí)的,如果沒(méi)有異步IO處理,進(jìn)程將被挾持,很浪費(fèi)時(shí)間,當(dāng)然這里不對(duì)異步IO作進(jìn)一步講解,想了解的童鞋,自行谷哥。
全文索引的使用方法并不復(fù)雜:
創(chuàng)建ALTER TABLE table ADD INDEX `FULLINDEX` USING FULLTEXT(`cname1`);
使用SELECT * FROM table WHERE MATCH(cname1) AGAINST (‘word’ MODE );
其中, MODE為搜尋方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。
關(guān)于這三種搜尋方式,愚安在這里也不多做交代,簡(jiǎn)單地說(shuō),就是,布爾模式,允許word里含一些特殊字符用于標(biāo)記一些具體的要求,如+表示一定要有,-表示一定沒(méi)有,*表示通用匹配符,是不是想起了正則,類似吧;自然語(yǔ)言模式,就是簡(jiǎn)單的單詞匹配;含表達(dá)式的自然語(yǔ)言模式,就是先用自然語(yǔ)言模式處理,對(duì)返回的結(jié)果,再進(jìn)行表達(dá)式匹配。
對(duì)搜索引擎稍微有點(diǎn)了解的同學(xué),肯定知道分詞這個(gè)概念,F(xiàn)ULLTEXT索引也是按照分詞原理建立索引的。西文中,大部分為字母文字,分詞可以很方便的按照空格進(jìn)行分割。但很明顯,中文不能按照這種方式進(jìn)行分詞。那又怎么辦呢?這個(gè)向大家介紹一個(gè)Mysql的中文分詞插件Mysqlcft,有了它,就可以對(duì)中文進(jìn)行分詞,想了解的同學(xué)請(qǐng)移步Mysqlcft,當(dāng)然還有其他的分詞插件可以使用。
HASH
Hash這個(gè)詞,可猜兄以說(shuō),自打我們開始碼的那一天起,就開始不停地見到和使用到了。其實(shí),hash就是一種(key=>value)形式的鍵值對(duì),如數(shù)學(xué)中的函數(shù)映射,允許多個(gè)key對(duì)應(yīng)相同的value,但不允許一個(gè)key對(duì)應(yīng)多個(gè)value。正是由于這個(gè)特性,hash很適合做索引,為某一列或幾列建立hash索引,就會(huì)利用這一列或幾列的值通過(guò)一定的算法計(jì)算出一個(gè)hash值,對(duì)應(yīng)一行或幾行數(shù)據(jù)(這里在概念上和函數(shù)映射有區(qū)別,不要混淆)。在java語(yǔ)言中,每個(gè)類都有自己的hashcode()方法,沒(méi)有顯示定義的都繼承自object類,該方法使得每一個(gè)對(duì)象都是唯一的,在進(jìn)行對(duì)象間equal比較,和序列化傳輸中起到了很重帶兆閉要的作用。hash的生成方法有很多種,足可以保證hash碼的唯一性,例如在MongoDB中,每一個(gè)document都有系統(tǒng)為其生成的唯一的objectID(包含時(shí)間戳,主機(jī)散列值,進(jìn)程PID,和自增ID)也是一種hash的表現(xiàn)。額,我好像扯遠(yuǎn)了-_-!
由于hash索引可以一次定位,不需要像樹形索引那樣逐層查找,因此具有極高的效率。那為什么還需要其蠢裂他的樹形索引呢?
在這里愚安就不自己總結(jié)了。引用下園子里其他大神的文章:來(lái)自 14的路 的MySQL的btree索引和hash索引的區(qū)別
(1)Hash 索引僅僅能滿足”=”,”IN”和””查詢,不能使用范圍查詢。
由于 Hash 索引比較的是進(jìn)行 Hash 運(yùn)算之后的 Hash 值,所以它只能用于等值的過(guò)濾,不能用于基于范圍的過(guò)濾,因?yàn)榻?jīng)過(guò)相應(yīng)的 Hash 算法處理之后的 Hash 值的大小關(guān)系,并不能保證和Hash運(yùn)算前完全一樣。
(2)Hash 索引無(wú)法被用來(lái)避免數(shù)據(jù)的排序操作。
由于 Hash 索引中存放的是經(jīng)過(guò) Hash 計(jì)算之后的 Hash 值,而且Hash值的大小關(guān)系并不一定和 Hash 運(yùn)算前的鍵值完全一樣,所以數(shù)據(jù)庫(kù)無(wú)法利用索引的數(shù)據(jù)來(lái)避免任何排序運(yùn)算;
(3)Hash 索引不能利用部分索引鍵查詢。
對(duì)于組合索引,Hash 索引在計(jì)算 Hash 值的時(shí)候是組合索引鍵合并后再一起計(jì)算 Hash 值,而不是單獨(dú)計(jì)算 Hash 值,所以通過(guò)組合索引的前面一個(gè)或幾個(gè)索引鍵進(jìn)行查詢的時(shí)候,Hash 索引也無(wú)法被利用。
(4)Hash 索引在任何時(shí)候都不能避免表掃描。
前面已經(jīng)知道,Hash 索引是將索引鍵通過(guò) Hash 運(yùn)算之后,將 Hash運(yùn)算結(jié)果的 Hash 值和所對(duì)應(yīng)的行指針信息存放于一個(gè) Hash 表中,由于不同索引鍵存在相同 Hash 值,所以即使取滿足某個(gè) Hash 鍵值的數(shù)據(jù)的記錄條數(shù),也無(wú)法從 Hash 索引中直接完成查詢,還是要通過(guò)訪問(wèn)表中的實(shí)際數(shù)據(jù)進(jìn)行相應(yīng)的比較,并得到相應(yīng)的結(jié)果。
(5)Hash 索引遇到大量Hash值相等的情況后性能并不一定就會(huì)比B-Tree索引高。
對(duì)于選擇性比較低的索引鍵,如果創(chuàng)建 Hash 索引,那么將會(huì)存在大量記錄指針信息存于同一個(gè) Hash 值相關(guān)聯(lián)。這樣要定位某一條記錄時(shí)就會(huì)非常麻煩,會(huì)浪費(fèi)多次表數(shù)據(jù)的訪問(wèn),而造成整體性能低下。
愚安我稍作補(bǔ)充,講一下HASH索引的過(guò)程,順便解釋下上面的第4,5條:
當(dāng)我們?yōu)槟骋涣谢蚰硯琢薪ash索引時(shí)(目前就只有MEMORY引擎顯式地支持這種索引),會(huì)在硬盤上生成類似如下的文件:
hash值 存儲(chǔ)地址
1db54bc745a#45b5
4bca452157d#4556,77#45cc…
…
hash值即為通過(guò)特定算法由指定列數(shù)據(jù)計(jì)算出來(lái),磁盤地址即為所在數(shù)據(jù)行存儲(chǔ)在硬盤上的地址(也有可能是其他存儲(chǔ)地址,其實(shí)MEMORY會(huì)將hash表導(dǎo)入內(nèi)存)。
這樣,當(dāng)我們進(jìn)行WHERE age = 18 時(shí),會(huì)將18通過(guò)相同的算法計(jì)算出一個(gè)hash值==>在hash表中找到對(duì)應(yīng)的儲(chǔ)存地址==>根據(jù)存儲(chǔ)地址取得數(shù)據(jù)。
所以,每次查詢時(shí)都要遍歷hash表,直到找到對(duì)應(yīng)的hash值,如(4),數(shù)據(jù)量大了之后,hash表也會(huì)變得龐大起來(lái),性能下降,遍歷耗時(shí)增加,如(5)。
REE
REE索引就是一種將索引值按一定的算法,存入一個(gè)樹形的數(shù)據(jù)結(jié)構(gòu)中,相信學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)的童鞋都對(duì)當(dāng)初學(xué)習(xí)二叉樹這種數(shù)據(jù)結(jié)構(gòu)的經(jīng)歷記憶猶新,反正愚安我當(dāng)時(shí)為了軟考可是被這玩意兒好好地折騰了一番,不過(guò)那次考試好像沒(méi)怎么考這個(gè)。如二叉樹一樣,每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。
REE在MyISAM里的形式和Innodb稍有不同
在 Innodb里,有兩種形態(tài):一是primary key形態(tài),其leaf node里存放的是數(shù)據(jù),而且不僅存放了索引鍵的數(shù)據(jù),還存放了其他字段的數(shù)據(jù)。二是secondary index,其leaf node和普通的REE差不多,只是還存放了指向主鍵的信息.
而在MyISAM里,主鍵和其他的并沒(méi)有太大區(qū)別。不過(guò)和Innodb不太一樣的地方是在MyISAM里,leaf node里存放的不是主鍵的信息,而是指向數(shù)據(jù)文件里的對(duì)應(yīng)數(shù)據(jù)行的信息.
RTREE
RTREE在mysql很少使用,僅支持geometry數(shù)據(jù)類型,支持該類型的存儲(chǔ)引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。
相對(duì)于REE,RTREE的優(yōu)勢(shì)在于范圍查找.
各種索引的使用情況
(1)對(duì)于REE這種Mysql默認(rèn)的索引類型,具有普遍的適用性
(2)由于FULLTEXT對(duì)中文支持不是很好,在沒(méi)有插件的情況下,更好不要使用。其實(shí),一些小的博客應(yīng)用,只需要在數(shù)據(jù)采集時(shí),為其建立關(guān)鍵字列表,通過(guò)關(guān)鍵字索引,也是一個(gè)不錯(cuò)的方法,至少愚安我是經(jīng)常這么做的。
(3)對(duì)于一些搜索引擎級(jí)別的應(yīng)用來(lái)說(shuō),F(xiàn)ULLTEXT同樣不是一個(gè)好的處理方法,Mysql的全文索引建立的文件還是比較大的,而且效率不是很高,即便是使用了中文分詞插件,對(duì)中文分詞支持也只是一般。真要碰到這種問(wèn)題,Apache的Lucene或許是你的選擇。
(4)正是因?yàn)閔ash表在處理較小數(shù)據(jù)量時(shí)具有無(wú)可比擬的素的優(yōu)勢(shì),所以hash索引很適合做緩存(內(nèi)存數(shù)據(jù)庫(kù))。如mysql數(shù)據(jù)庫(kù)的內(nèi)存版本Memsql,使用量很廣泛的緩存工具M(jìn)encached,NoSql數(shù)據(jù)庫(kù)redis等,都使用了hash索引這種形式。當(dāng)然,不想學(xué)習(xí)這些東西的話Mysql的MEMORY引擎也是可以滿足這種需求的。
(5)至于RTREE,愚安我至今還沒(méi)有使用過(guò),它具體怎么樣,我就不知道了。有RTREE使用經(jīng)歷的同學(xué),到時(shí)可以交流下!
在滿足語(yǔ)句需求的情況下,盡量少的訪問(wèn)資源是數(shù)據(jù)庫(kù)設(shè)計(jì)的重要原則,這和執(zhí)行的 SQL 有直接的關(guān)系,索引問(wèn)題又是 SQL 問(wèn)題中出現(xiàn)頻率更高的,常見的索引問(wèn)題包括:無(wú)索引(失效)、隱式轉(zhuǎn)換。
1. SQL 執(zhí)行流程看一個(gè)問(wèn)題,在下面這個(gè)表 T 中,如果我要執(zhí)行 select * from T where k between 3 and 5; 需要執(zhí)行幾次樹的搜索操作,會(huì)掃描多少行?mysql> create table T ( -> ID int primary key, -> k int NOT NULL DEFAULT 0, -> s varchar(16) NOT NULL DEFAULT ”, -> index k(k)) -> engine=InnoDB;mysql> insert into T values(100,1, ‘a(chǎn)a’),(200,2,’bb’),\ (300,3,’cc’),(500,5,’ee’),(600,6,’ff’),(700,7,’gg’);
這分別是 ID 字段索引樹、k 字段索引樹。
這條 SQL 語(yǔ)句的執(zhí)行流程:
1. 在 k 索引樹上找到 k=3,獲得 ID=3002. 回表到 ID 索引樹查找 ID=300 的記錄,對(duì)應(yīng) R33. 在 k 索引樹找到下一個(gè)值 k=5,ID=5004. 再回到哪鋒 ID 索引樹找到對(duì)應(yīng) ID=500 的 R4
5. 在 k 索引樹去下一個(gè)值 k=6,不符合條件,循環(huán)結(jié)束
這個(gè)過(guò)程讀取了 k 索引樹的三條記錄,回表了兩次。因?yàn)椴樵兘Y(jié)果所需要的數(shù)據(jù)只在主鍵索引上有,所以必須得回表。所以,我們?cè)撊绾瓮ㄟ^(guò)優(yōu)化索引,來(lái)避免回表呢?
2. 常見索引優(yōu)化2.1 覆蓋索引覆蓋索引,換言之就是索引要覆蓋我們的查詢請(qǐng)求,無(wú)需回表。
如果執(zhí)行的語(yǔ)句是 select ID from T wherek between 3 and 5;,這樣的話因?yàn)?ID 的值在 k 索引樹上,就不需要回表了。
覆蓋索引可以減少樹的搜索次數(shù),顯著提升查詢性能,是常用的性能優(yōu)化手段。
但是,維護(hù)索引是有代價(jià)的,所以在建立冗余索引來(lái)支持覆蓋索引時(shí)要權(quán)衡利弊。
2.2 最左前綴原則
B+ 樹的數(shù)據(jù)項(xiàng)是復(fù)合的數(shù)據(jù)結(jié)構(gòu),比如 (name,sex,age) 的時(shí)候,B+ 樹是按照從左到右的順序來(lái)建立搜索樹的,當(dāng) (張三,F,26) 這樣的數(shù)據(jù)來(lái)檢索的時(shí)候,B+ 樹會(huì)優(yōu)先比較 name 來(lái)確定下一步的檢索方向,如果 name 相同再依次比較 sex 和 age,最后得到檢索的數(shù)據(jù)。
# 有這樣一個(gè)表李源晌 P
mysql> create table P (id int primary key, name varchar(10) not null, sex varchar(1), age int, index tl(name,sex,age)) engine=IInnoDB;
mysql> insert into P values(1,’張三’,’F’,26),(2,’張裂差三’,’M’,27),(3,’李四’,’F’,28),(4,’烏茲’,’F’,22),(5,’張三’,’M’,21),(6,’王五’,’M’,28);
# 下面的語(yǔ)句結(jié)果相同
mysql> select * from P where name=’張三’ and sex=’F’; ## A1
mysql> select * from P where sex=’F’ and age=26;## A2
# explain 看一下
mysql> explain select * from P where name=’張三’ and sex=’F’;
+—-++++——+-+——+++——+++
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref| rows | filtered | Extra|
+—-++++——+-+——+++——+++
| 1 | SIMPLE | P | NULL| ref | tl| tl || const,const | 1 | 100.00 | Using index |
+—-++++——+-+——+++——+++
mysql> explain select * from P where sex=’F’ and age=26;
+—-+++++-+——++——+——+++
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+—-+++++-+——++——+——+++
| 1 | SIMPLE | P | NULL| index | NULL| tl || NULL | 6 | 16.67 | Using where; Using index |
+—-+++++-+——++——+——+++
可以清楚的看到,A1 使用 tl 索引,A2 進(jìn)行了全表掃描,雖然 A2 的兩個(gè)條件都在 tl 索引中出現(xiàn),但是沒(méi)有使用到 name 列,不符合最左前綴原則,無(wú)法使用索引。所以在建立聯(lián)合索引的時(shí)候,如何安排索引內(nèi)的字段排序是關(guān)鍵。評(píng)估標(biāo)準(zhǔn)是索引的復(fù)用能力,因?yàn)橹С肿钭笄熬Y,所以當(dāng)建立(a,b)這個(gè)聯(lián)合索引之后,就不需要給 a 單獨(dú)建立索引。原則上,如果通過(guò)調(diào)整順序,可以少維護(hù)一個(gè)索引,那么這個(gè)順序往往就是需要優(yōu)先考慮采用的。上面這個(gè)例子中,如果查詢條件里只有 b,就是沒(méi)法利用(a,b)這個(gè)聯(lián)合索引的,這時(shí)候就不得不維護(hù)另一個(gè)索引,也就是說(shuō)要同時(shí)維護(hù)(a,b)、(b)兩個(gè)索引。這樣的話,就需要考慮空間占用了,比如,name 和 age 的聯(lián)合索引,name 字段比 age 字段占用空間大,所以創(chuàng)建(name,age)聯(lián)合索引和(age)索引占用空間是要小于(age,name)、(name)索引的。
2.3 索引下推
以人員表的聯(lián)合索引(name, age)為例。如果現(xiàn)在有一個(gè)需求:檢索出表中“名字之一個(gè)字是張,而且年齡是26歲的所有男性”。那么,SQL 語(yǔ)句是這么寫的mysql> select * from tuser where name like ‘張%’ and age=26 and sex=M;
通過(guò)最左前綴索引規(guī)則,會(huì)找到 ID1,然后需要判斷其他條件是否滿足在 MySQL 5.6 之前,只能從 ID1 開始一個(gè)個(gè)回表。到主鍵索引上找出數(shù)據(jù)行,再對(duì)比字段值。而 MySQL 5.6 引入的索引下推優(yōu)化(index condition pushdown),可以在索引遍歷過(guò)程中,對(duì)索引中包含的字段先做判斷,直接過(guò)濾掉不滿足條件的記錄,減少回表次數(shù)。這樣,減少了回表次數(shù)和之后再次過(guò)濾的工作量,明顯提高檢索速度。
2.4 隱式類型轉(zhuǎn)化
隱式類型轉(zhuǎn)化主要原因是,表結(jié)構(gòu)中指定的數(shù)據(jù)類型與傳入的數(shù)據(jù)類型不同,導(dǎo)致索引無(wú)法使用。所以有兩種方案:
修改表結(jié)構(gòu),修改字段數(shù)據(jù)類型。
修改應(yīng)用,將應(yīng)用中傳入的字符類型改為與表結(jié)構(gòu)相同類型。
3. 為什么會(huì)選錯(cuò)索引3.1 優(yōu)化器選擇索引是優(yōu)化器的工作,其目的是找到一個(gè)更優(yōu)的執(zhí)行方案,用最小的代價(jià)去執(zhí)行語(yǔ)句。在數(shù)據(jù)庫(kù)中,掃描行數(shù)是影響執(zhí)行代價(jià)的因素之一。掃描的行數(shù)越少,意味著訪問(wèn)磁盤數(shù)據(jù)的次數(shù)越少,消耗的 CPU 資源越少。當(dāng)然,掃描行數(shù)并不是唯一的判斷標(biāo)準(zhǔn),優(yōu)化器還會(huì)結(jié)合是否使用臨時(shí)表、是否排序等因素進(jìn)行綜合判斷。
3.2 掃描行數(shù)
MySQL 在真正開始執(zhí)行語(yǔ)句之前,并不能精確的知道滿足這個(gè)條件的記錄有多少條,只能通過(guò)索引的區(qū)分度來(lái)判斷。顯然,一個(gè)索引上不同的值越多,索引的區(qū)分度就越好,而一個(gè)索引上不同值的個(gè)數(shù)我們稱為“基數(shù)”,也就是說(shuō),這個(gè)基數(shù)越大,索引的區(qū)分度越好。# 通過(guò) show index 方法,查看索引的基數(shù)mysql> show index from t;++++++++++——+++-+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |++++++++++——+++-+| t || PRIMARY || id| A|| NULL | NULL | | REE || || t || a|| a| A|| NULL | NULL | YES | REE || || t || b|| b| A|| NULL | NULL | YES | REE || |++++++++++——+++-+
MySQL 使用采樣統(tǒng)計(jì)方法來(lái)估算基數(shù):采樣統(tǒng)計(jì)的時(shí)候,InnoDB 默認(rèn)會(huì)選擇 N 個(gè)數(shù)據(jù)頁(yè),統(tǒng)計(jì)這些頁(yè)面上的不同值,得到一個(gè)平均值,然后乘以這個(gè)索引的頁(yè)面數(shù),就得到了這個(gè)索引的基數(shù)。而數(shù)據(jù)表是會(huì)持續(xù)更新的,索引統(tǒng)計(jì)信息也不會(huì)固定不變。所以,當(dāng)變更的數(shù)據(jù)行數(shù)超過(guò) 1/M 的時(shí)候,會(huì)自動(dòng)觸發(fā)重新做一次索引統(tǒng)計(jì)。
在 MySQL 中,有兩種存儲(chǔ)索引統(tǒng)計(jì)的方式,可以通過(guò)設(shè)置參數(shù) innodb_stats_persistent 的值來(lái)選擇:
on 表示統(tǒng)計(jì)信息會(huì)持久化存儲(chǔ)。默認(rèn) N = 20,M = 10。
off 表示統(tǒng)計(jì)信息只存儲(chǔ)在內(nèi)存中。默認(rèn) N = 8,M = 16。
由于是采樣統(tǒng)計(jì),所以不管 N 是 20 還是 8,這個(gè)基數(shù)都很容易不準(zhǔn)確。所以,冤有頭債有主,MySQL 選錯(cuò)索引,還得歸咎到?jīng)]能準(zhǔn)確地判斷出掃描行數(shù)。
可以用 yze table 來(lái)重新統(tǒng)計(jì)索引信息,進(jìn)行修正。
ANAZE TABLE tbl_name …
關(guān)于mysql 查看數(shù)據(jù)庫(kù)所有索引的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站設(shè)計(jì)制作選創(chuàng)新互聯(lián),專業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專注成都高端網(wǎng)站建設(shè)定制開發(fā)服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開發(fā),營(yíng)銷網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
分享標(biāo)題:如何查看MySQL的所有索引? (mysql 查看數(shù)據(jù)庫(kù)所有索引)
當(dāng)前網(wǎng)址:http://www.fisionsoft.com.cn/article/cddecsp.html


咨詢
建站咨詢
