在mysql中,索引是一種特殊的數(shù)據(jù)庫結(jié)構(gòu),由數(shù)據(jù)表中的一列或多列組合而成,可以用來快速查詢數(shù)據(jù)表中有某一特定值的記錄。
創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)柳北,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
通過索引,查詢數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢索引列即可。
通過索引,查詢數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢索引列。否則,數(shù)據(jù)庫系統(tǒng)將讀取每條記錄的所有信息進(jìn)行匹配。
可以把索引比作新華字典的音序表。例如,要查“庫”字,如果不使用音序,就需要從字典的 400 頁中逐頁來找。但是,如果提取拼音出來,構(gòu)成音序表,就只需要從 10 多頁的音序表中直接查找。這樣就可以大大節(jié)省時(shí)間。
因此,使用索引可以很大程度上提高數(shù)據(jù)庫的查詢速度,還有效的提高了數(shù)據(jù)庫系統(tǒng)的性能。
索引的優(yōu)缺點(diǎn)
索引有其明顯的優(yōu)勢,也有其不可避免的缺點(diǎn)。
優(yōu)點(diǎn)
索引的優(yōu)點(diǎn)如下:
1、通過創(chuàng)建唯一索引可以保證數(shù)據(jù)庫表中每一行數(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)對表中的數(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è)看使用場景
MYSQL在創(chuàng)建索引后對索引的使用方式分為兩種:
1 由數(shù)據(jù)庫的查詢優(yōu)化器自動(dòng)判斷是否使用索引;
2 用戶可在寫SQL語句時(shí)強(qiáng)制使用索引
一共3張表 knowledge , knowledge_question , knowledge_answer ,數(shù)據(jù)在 6000~10000 之間。
執(zhí)行的語句:
執(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í)行上來看,并沒有使用索引 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 的問題,可以先 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ù) 剛開始,數(shù)據(jù)不多的時(shí)候,執(zhí)行效果還不錯(cuò)。 隨著數(shù)據(jù)量的增加,這個(gè)查詢,執(zhí)行起來,越來越慢了。 然后在 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 字段上面,沒有索引 索引只在 name 上面有 換句話說, 也就是 WHERE 里面的條件, 會(huì)自動(dòng)判斷,有沒有 可用的索引,如果有, 該不該用。 多列索引,就是一個(gè)索引,包含了2個(gè)字段。 例如:CREATE INDEX idx_test_name_age ON test_tab (name, age);那么SELECT * FROM test_tabWHEREname LIKE '張%' AND age = 25 這樣的查詢,將能夠使用上面的索引。 多列索引,還有一個(gè)可用的情況就是, 某些情況下,可能查詢,只訪問索引就足夠了, 不需要再訪問表了。例如: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;
網(wǎng)站標(biāo)題:mysql怎么按索引查詢,mysql如何使用索引查詢
當(dāng)前鏈接:http://chinadenli.net/article12/hddddc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、電子商務(wù)、云服務(wù)器、虛擬主機(jī)、響應(yīng)式網(wǎng)站、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)