在mysql中,索引是一種特殊的數(shù)據(jù)庫(kù)結(jié)構(gòu),由數(shù)據(jù)表中的一列或多列組合而成,可以用來(lái)快速查詢數(shù)據(jù)表中有某一特定值的記錄。
創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)柳北,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220
通過(guò)索引,查詢數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢索引列即可。
通過(guò)索引,查詢數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢索引列。否則,數(shù)據(jù)庫(kù)系統(tǒng)將讀取每條記錄的所有信息進(jìn)行匹配。
可以把索引比作新華字典的音序表。例如,要查“庫(kù)”字,如果不使用音序,就需要從字典的 400 頁(yè)中逐頁(yè)來(lái)找。但是,如果提取拼音出來(lái),構(gòu)成音序表,就只需要從 10 多頁(yè)的音序表中直接查找。這樣就可以大大節(jié)省時(shí)間。
因此,使用索引可以很大程度上提高數(shù)據(jù)庫(kù)的查詢速度,還有效的提高了數(shù)據(jù)庫(kù)系統(tǒng)的性能。
索引的優(yōu)缺點(diǎn)
索引有其明顯的優(yōu)勢(shì),也有其不可避免的缺點(diǎn)。
優(yōu)點(diǎn)
索引的優(yōu)點(diǎn)如下:
1、通過(guò)創(chuàng)建唯一索引可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
2、可以給所有的 MySQL 列類型設(shè)置索引。
3、可以大大加快數(shù)據(jù)的查詢速度,這是使用索引最主要的原因。
4、在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面可以加速表與表之間的連接。
5、在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢時(shí)也可以顯著減少查詢中分組和排序的時(shí)間
缺點(diǎn)
增加索引也有許多不利的方面,主要如下:
1、創(chuàng)建和維護(hù)索引組要耗費(fèi)時(shí)間,并且隨著數(shù)據(jù)量的增加所耗費(fèi)的時(shí)間也會(huì)增加。
2、索引需要占磁盤空間,除了數(shù)據(jù)表占數(shù)據(jù)空間以外,每一個(gè)索引還要占一定的物理空間。如果有大量的索引,索引文件可能比數(shù)據(jù)文件更快達(dá)到最大文件尺寸。
3、當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。
使用索引時(shí),需要綜合考慮索引的優(yōu)點(diǎn)和缺點(diǎn)。
mysql 添加索引后 在查詢的時(shí)候是mysql就自動(dòng)從索引里面查詢了。如果需要也可以單獨(dú)根據(jù)索引查詢,這個(gè)看使用場(chǎng)景
MYSQL在創(chuàng)建索引后對(duì)索引的使用方式分為兩種:
1 由數(shù)據(jù)庫(kù)的查詢優(yōu)化器自動(dòng)判斷是否使用索引;
2 用戶可在寫SQL語(yǔ)句時(shí)強(qiáng)制使用索引
一共3張表 knowledge , knowledge_question , knowledge_answer ,數(shù)據(jù)在 6000~10000 之間。
執(zhí)行的語(yǔ)句:
執(zhí)行時(shí)間約 10分鐘 ,查看執(zhí)行計(jì)劃如下:
全部都是全表掃描,根據(jù)MySQL聯(lián)表查詢的算法 Nested-Loop Join ,MySQL查詢的結(jié)果集是3張表的笛卡爾積,所以效率特別低。
耗時(shí)變成 20毫秒
給Where條件建立索引,并不一定會(huì)使用。
比如:在表 knowledge 的字段 update 上建立索引 idx_time :
結(jié)果執(zhí)行上來(lái)看,并沒(méi)有使用索引 idx_time 。
如果where條件從 k.update_time'2019-01-03 12:00:00' 修改為 k.update_time='2019-01-03 12:00:00' (從 變成 = )
則會(huì)使用索引 idx_time
在建立索引的時(shí)候,會(huì)遇到 Table Metadata Lock 的問(wèn)題,可以先 show processlist ,找到占用表鎖的連接,然后 kill 。
假如你有一個(gè)表, SQL CREATE TABLE test_tab (2 id INT, 3 name VARCHAR(10), 4 age INT, 5 val VARCHAR(10)6 );你的業(yè)務(wù),有一個(gè)查詢,是 SELECT * FROM test_tab WHERE name = 一個(gè)外部輸入的數(shù)據(jù) 剛開(kāi)始,數(shù)據(jù)不多的時(shí)候,執(zhí)行效果還不錯(cuò)。 隨著數(shù)據(jù)量的增加,這個(gè)查詢,執(zhí)行起來(lái),越來(lái)越慢了。 然后在 name 上面 建立了索引 CREATE INDEX idx_test4_name ON test_tab (name ); 這樣, 可以加快前面那個(gè)查詢的速度。 但是,某天,你執(zhí)行了下面這個(gè)SQL, 發(fā)現(xiàn)速度又慢了 SELECT * FROM test_tab WHERE age = 25 為啥呢? 因?yàn)?age 字段上面,沒(méi)有索引 索引只在 name 上面有 換句話說(shuō), 也就是 WHERE 里面的條件, 會(huì)自動(dòng)判斷,有沒(méi)有 可用的索引,如果有, 該不該用。 多列索引,就是一個(gè)索引,包含了2個(gè)字段。 例如:CREATE INDEX idx_test_name_age ON test_tab (name, age);那么SELECT * FROM test_tabWHEREname LIKE '張%' AND age = 25 這樣的查詢,將能夠使用上面的索引。 多列索引,還有一個(gè)可用的情況就是, 某些情況下,可能查詢,只訪問(wèn)索引就足夠了, 不需要再訪問(wèn)表了。例如:SELECTAVG( avg ) AS 平均年齡FROMtest_tabWHEREname LIKE '張%' 這個(gè)時(shí)候, name 與 age 都包含在索引里面。 查詢不需要去檢索表中的數(shù)據(jù)。
explain SELECT count(1) FROM goods_order use index(INDEX_ORDER_TYPE) where ORDER_TYPE=0;