顯示一個(gè)表所有索引的SQL語(yǔ)句是:
成都創(chuàng)新互聯(lián)是專(zhuān)業(yè)的卓資網(wǎng)站建設(shè)公司,卓資接單;提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行卓資網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
show index from 數(shù)據(jù)庫(kù)名.表名
查看某表某一列上的索引使用下面的SQL語(yǔ)句:
show index from 數(shù)據(jù)庫(kù)名.表名 where column_name like '列名'
下面的SQL語(yǔ)句在我的數(shù)據(jù)庫(kù)上執(zhí)行成功:
show index from web.clubuser where column_name like 'user'。
1、主鍵自動(dòng)建立唯一索引
2、頻繁作為查詢(xún)條件的字段
3、查詢(xún)中與其他表關(guān)聯(lián)的字段,外鍵關(guān)系建立索引
4、單鍵/組合索引的選擇問(wèn)題,高并發(fā)下傾向創(chuàng)建組合索引
5、查詢(xún)中排序的字段,排序字段通過(guò)索引訪(fǎng)問(wèn)大幅提高排序速度
6、查詢(xún)中統(tǒng)計(jì)或分組字段
1、表記錄太少
2、經(jīng)常增刪改的表
3、數(shù)據(jù)重復(fù)且分布均勻的表字段,只應(yīng)該為經(jīng)常查詢(xún)和最經(jīng)常排序的數(shù)據(jù)列建立索引(如果某個(gè)數(shù)據(jù)類(lèi)包含太多的重復(fù)數(shù)據(jù),建立索引沒(méi)有太大意義)
4、頻繁更新的字段不適合創(chuàng)建索引(會(huì)增加IO負(fù)擔(dān))
5、where條件里用不到的字段不創(chuàng)建索引
假如你有一個(gè)表,
SQL CREATE TABLE test_tab (
2 id INT,
3 name VARCHAR(10),
4 age INT,
5 val VARCHAR(10)
6 );
你的業(yè)務(wù),有一個(gè)查詢(xún),是
SELECT * FROM test_tab WHERE name = 一個(gè)外部輸入的數(shù)據(jù)
剛開(kāi)始,數(shù)據(jù)不多的時(shí)候,執(zhí)行效果還不錯(cuò)。
隨著數(shù)據(jù)量的增加,這個(gè)查詢(xún),執(zhí)行起來(lái),越來(lái)越慢了。
然后在 name 上面 建立了索引
CREATE INDEX idx_test4_name ON test_tab (name );
這樣, 可以加快前面那個(gè)查詢(xún)的速度。
但是,某天,你執(zhí)行了下面這個(gè)SQL, 發(fā)現(xiàn)速度又慢了
SELECT * FROM test_tab WHERE age = 25
為啥呢? 因?yàn)?age 字段上面,沒(méi)有索引
索引只在 name 上面有
換句話(huà)說(shuō), 也就是 WHERE 里面的條件, 會(huì)自動(dòng)判斷,有沒(méi)有 可用的索引,如果有, 該不該用。
多列索引,就是一個(gè)索引,包含了2個(gè)字段。
例如:
CREATE INDEX idx_test_name_age ON test_tab (name, age);
那么
SELECT * FROM test_tab
WHERE
name LIKE '張%'
AND age = 25
這樣的查詢(xún),將能夠使用上面的索引。
多列索引,還有一個(gè)可用的情況就是, 某些情況下,可能查詢(xún),只訪(fǎng)問(wèn)索引就足夠了, 不需要再訪(fǎng)問(wèn)表了。例如:
SELECT
AVG( avg ) AS 平均年齡
FROM
test_tab
WHERE
name LIKE '張%'
這個(gè)時(shí)候, name 與 age 都包含在索引里面。 查詢(xún)不需要去檢索表中的數(shù)據(jù)。
mysql優(yōu)化無(wú)索引查詢(xún):SQL CREATE TABLE test_tab (id INT,name VARCHAR(10),age INT,val VARCHAR(10)。
1、對(duì)查詢(xún)進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在where及order by涉及的列上建立索引。
2、應(yīng)盡量避免在 where子句中使用!=或操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。
3、應(yīng)盡量避免在 where子句中對(duì)字段進(jìn)行null值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。
運(yùn)行mysql安裝文件:
按 Next,然后選擇安裝方式,有 "Typical(默認(rèn))"、"Complete(完全)"、"Custom(用戶(hù)自定義)",選擇第二個(gè)選項(xiàng) "Custom",下一步, MySQL Server (mysql服務(wù)器), Developer Components (開(kāi)發(fā)者部分), Debug Symbols (調(diào)試符號(hào)), Server data files (服務(wù)器數(shù)據(jù)文件) 默認(rèn)。
改變安裝路徑;原路徑是"C:\Program Files\MySQL\MySQL Server 5.5\",也可以修改為:"E:\Program Files\MySQL Server 5.5\"。
類(lèi)似地,如果WHERE子句的查詢(xún)條件里使用了函數(shù)(WHERE DAY(column) = …),MySQL也將無(wú)法使用索引。在JOIN操作中(需要從多個(gè)數(shù)據(jù)表提取數(shù)據(jù)時(shí)),MySQL只有在主鍵和外鍵的數(shù)據(jù)類(lèi)型相同時(shí)才能使用索引。
單獨(dú)的索引和復(fù)合索引的索引。單一索引,只包含單個(gè)列,一個(gè)表可以有多個(gè)單獨(dú)的索引,而不是索引的組合的索引。綜合指數(shù),即包含多個(gè)列的電纜。
MySQL索引的類(lèi)型包括:
(1)一般指數(shù)
這是最基本的索引,它沒(méi)有任何限制。它創(chuàng)造了幾種方法:
◆創(chuàng)建一個(gè)索引
CREATE INDEX INDEXNAME ON mytable的(用戶(hù)名(長(zhǎng)度));
如果CHAR,VARCHAR類(lèi)型,長(zhǎng)度可以小于的實(shí)際長(zhǎng)度場(chǎng),如果是BLOB和TEXT類(lèi)型,必須指定長(zhǎng)度,下同。
◆表結(jié)構(gòu)
ALTER mytable的ADD INDEX [INDEXNAME]開(kāi)(用戶(hù)名(長(zhǎng)度))
◆當(dāng)您創(chuàng)建一個(gè)表直接指定
CREATE TABLE mytable的(ID INT NOT NULL ,用戶(hù)名VARCHAR(16)NOT NULL,索引[INDEXNAME](用戶(hù)名(長(zhǎng)度)));
刪除索引的語(yǔ)法:
DROP INDEX [INDEXNAME] ON mytable的;
(2)唯一索引
它類(lèi)似于以前的一般指標(biāo),不同的是:索引列的值必須是唯一的,但是允許空值。如果它是一個(gè)綜合指數(shù)相結(jié)合,列值??必須是唯一的。它創(chuàng)造了幾種方法:
◆創(chuàng)建一個(gè)索引
CREATE UNIQUE INDEX INDEXNAME ON mytable的(用戶(hù)名(長(zhǎng)度))
◆表結(jié)構(gòu)
ALTER mytable的ADD UNIQUE [INDEXNAME]開(kāi)啟(用戶(hù)名(長(zhǎng)度))
◆當(dāng)您創(chuàng)建一個(gè)表直接指定
CREATE TABLE mytable的(ID INT NOT NULL,用戶(hù)名VARCHAR(16)NOT NULL,UNIQUE [INDEXNAME](用戶(hù)名(長(zhǎng)度))) ;
(3)主鍵索引
這是一個(gè)特殊的唯一索引不允許空值。一般的時(shí)候同時(shí)創(chuàng)建主鍵索引的表的結(jié)構(gòu):
CREATE TABLE mytable的(ID INT NOT NULL,用戶(hù)名VARCHAR(16)NOT NULL,PRIMARY KEY(ID));
當(dāng)然,你可以使用ALTER命令。請(qǐng)記?。阂粋€(gè)表只能有一個(gè)主鍵。
(4)綜合指數(shù)
對(duì)于圖像的對(duì)比度和組合索引單列索引,添加更多的字段的表:
CREATE TABLE mytable的(ID INT NOT NULL,用戶(hù)名VARCHAR(16)NOT NULL ,城市VARCHAR(50)NOT NULL,年齡INT NOT NULL);
為了進(jìn)一步榨取MySQL的效率,就要考慮建立組合索引。是的名稱(chēng),城市,年齡建成一個(gè)索引,其中:
ALTER TABLE mytable的ADD INDEX name_city_age(名(10),城市,年齡);
建立表時(shí),16 usernname長(zhǎng)度,其中10。這是因?yàn)樵谡G闆r下不超過(guò)10名,這將加快查詢(xún)速度索引的長(zhǎng)度,該指數(shù)將減少文件大小,提高INSERT的更新速度。
如果您創(chuàng)建的每個(gè)usernname一個(gè)單獨(dú)的索引,城市,年齡,所以該表有三個(gè)單獨(dú)的索引,上面的查詢(xún)和索引的組合效率會(huì)有很大的不同,遠(yuǎn)遠(yuǎn)超過(guò)我們的組合索引少。雖然此時(shí)有了三個(gè)索引,但MySQL只可以使用它們認(rèn)為這似乎是最有效的單一指標(biāo)。
建立這樣的組合索引,其實(shí)是三組相當(dāng)于建立了以下綜合指數(shù):
usernname,城市,年齡usernname,城市usernname
為什么沒(méi)有城市,年齡該做組合索引?它是一個(gè)綜合指數(shù),因?yàn)镸ySQL的結(jié)果“最左前綴”一個(gè)。這只是意味著,左側(cè)只有從一開(kāi)始的組合。不僅包含了這三個(gè)疑問(wèn)將在綜合指數(shù)中使用,下面的幾個(gè)SQL就會(huì)使用這個(gè)組合索引:
SELECT * FROM mytable的WHREE用戶(hù)名=“管理員”和城市=“鄭州”SELECT * FROM mytable的WHREE用戶(hù)名= “管理員”
接下來(lái)的幾個(gè)未使用:
SELECT * FROM mytable的WHREE年齡為20及城市=“鄭州”SELECT * FROM mytable的WHREE城市=“鄭州”
(5)索引時(shí)間
在這里,我們已經(jīng)學(xué)會(huì)了建立索引,那么我們需要在什么情況下創(chuàng)建索引?通常,當(dāng)連接列和出現(xiàn)在需要建立索引,但也不完全如此,因?yàn)镸ySQL只,, =,BETWEEN,IN,LIKE,有的時(shí)候會(huì)使用索引。例如:
選擇t.Name FROM mytable的噸LEFT JOIN mytable的M于t.Name = m.username WHERE m.age = 20和m.city ='鄭州'
這時(shí)候就需要城市與年齡索引,由于userame mytable的表也出現(xiàn)在JOIN子句中,也有必要建立索引。
只是它需要像索引的時(shí)候一定提及。因?yàn)樵谝婚_(kāi)始通配符%和_的查詢(xún),MySQL不會(huì)使用索引。例如,下面的語(yǔ)句將使用索引:
SELECT * FROM mytable的其中username like'admin%'
下一句不會(huì)使用:
SELECT * FROM mytable的WHEREt名稱(chēng)LIKE'% admin的
因此,更應(yīng)注意使用LIKE差異。
(6)指數(shù)
的不足之處上面是說(shuō)使用索引的好處,但過(guò)量使用索引將會(huì)造成濫用。因此,該指數(shù)也有其缺點(diǎn):
◆雖然索引大大提高了查詢(xún)速度,但會(huì)降低更新表,如表的INSERT,UPDATE的速度和DELETE。因?yàn)楫?dāng)你更新表,MySQL只保存數(shù)據(jù),而且還節(jié)省大約索引文件。
◆建立索引會(huì)占用磁盤(pán)空間的索引文件。通常這個(gè)問(wèn)題不是太嚴(yán)重,但如果你是在一個(gè)大表創(chuàng)建各種復(fù)合索引,索引文件將很快擴(kuò)大。
指數(shù)只是其中的一個(gè)因素,以提高效率,如果你有大量的數(shù)據(jù)的MySQL表,你需要花時(shí)間去研究建立最佳的索引,或優(yōu)化查詢(xún)。
(7)使用索引
注意事項(xiàng)使用索引時(shí),下面的一些技巧和注意事項(xiàng):??
◆索引不會(huì)包含NULL值的列只要列中包含 BR /有NULL值?將不會(huì)被包含在索引中,復(fù)合索引,只要有包含NULL值的列,那么這個(gè)列是此復(fù)合索引無(wú)效。所以,我們不要讓默認(rèn)字段為NULL的數(shù)據(jù)庫(kù)設(shè)計(jì)。
就用短串聯(lián)指數(shù)指標(biāo),如果可能的話(huà),你應(yīng)該指定一個(gè)前綴長(zhǎng)度。例如,如果一個(gè)CHAR(255)列,如果在前10或20個(gè)字符之內(nèi),多個(gè)值?是獨(dú)一無(wú)二的,那就不要索引整個(gè)列。短索引不僅可以提高查詢(xún)速度而且可以節(jié)省磁盤(pán)空間和I / O操作。
◆索引列排序
MySQL查詢(xún)只使用一個(gè)索引,因此如果where子句已在索引中使用,然后按列的順序?qū)⒉粫?huì)使用索引。因此,不要使用默認(rèn)的數(shù)據(jù)庫(kù)排序時(shí)排序操作即可滿(mǎn)足要求;盡量不要包含多個(gè)排序列,如果需要的話(huà)最好創(chuàng)建這些列的一個(gè)綜合指數(shù)。
◆like語(yǔ)句
在正常情況下運(yùn)行不鼓勵(lì)使用類(lèi)似的操作,如果非使用不可,如何使用也是一個(gè)問(wèn)題。如“%AAA%”不會(huì)使用索引而不是像“AAA%”可以使用索引。
◆不要在列選擇*從用戶(hù)那里YEAR(錄入)2007年
操作將在每個(gè)行上進(jìn)行的,這將導(dǎo)致失敗而進(jìn)行全表索引掃描,所以我們可以改變
選擇*從用戶(hù)那里錄入時(shí)間'2007-01-01';
◆不使用NOT IN和
更多操作上的MySQL索引類(lèi)型進(jìn)行了介紹。
轉(zhuǎn)移: - TID-33491