? ? ? ? 1. 搜索的索引列,不一定是所要選擇的列。換句話說,最適合索引的列是出如今WHERE 子句中的列,或連接子句中指定的列,而不是出如今SELECT keyword后的選擇列表中的列。
? ? ? ? 2. 使用惟一索引。考慮某列中值的分布。對(duì)于惟一值的列,索引的效果最好,而具有多個(gè)反復(fù)值的列,其索引效果最差。比如,存放年齡的列具有不同值,非常easy區(qū)分各行。而用來記錄性別的列,僅僅含有“ M”和“F”,則對(duì)此列進(jìn)行索引沒有多大用處(無論搜索哪個(gè)值,都會(huì)得出大約一半的行)
? ? ? ? 3. 使用短索引。假設(shè)對(duì)串列進(jìn)行索引,應(yīng)該指定一個(gè)前綴長(zhǎng)度,僅僅要有可能就應(yīng)該這樣做。比如,假設(shè)有一個(gè)CHAR(200) 列,假設(shè)在前10 個(gè)或20 個(gè)字符內(nèi),多數(shù)值是惟一的,那么就不要對(duì)整個(gè)列進(jìn)行索引。對(duì)前10 個(gè)或20 個(gè)字符進(jìn)行索引可以節(jié)省大量索引空間,也可能會(huì)使查詢更快。較小的索引涉及的磁盤I/O 較少,較短的值比較起來更快。更為重要的是,對(duì)于較短的鍵值,索引快速緩存中的塊能容納很多其它的鍵值,因此,MySQL也可以在內(nèi)存中容納很多其它的值。這添加了找到行而不用讀取索引中較多塊的可能性。(當(dāng)然,應(yīng)該利用一些常識(shí)。如僅用列值的第一個(gè)字符進(jìn)行索引是不可能有多大優(yōu)點(diǎn)的,由于這個(gè)索引中不會(huì)有很多不同的值。)
? ? ? ? 4. 利用最左前綴。在創(chuàng)建一個(gè)n 列的索引時(shí),實(shí)際是創(chuàng)建了MySQL 可利用的n 個(gè)索引。多列索引可起幾個(gè)索引的作用,由于可利用索引中最左邊的列集來匹配行。這種列集稱為最左前綴。(這與索引一個(gè)列的前綴不同,索引一個(gè)列的前綴是利用該的前n 個(gè)字符作為索引值。)
? ? ? ? 5. 不要過度索引。不要以為索引“越多越好”,什么東西都用索引是錯(cuò)的。每一個(gè)額外的索引都要占用額外的磁盤空間,并減少寫操作的性能,這一點(diǎn)我們前面已經(jīng)介紹過。在改動(dòng)表的內(nèi)容時(shí),索引必須進(jìn)行更新,有時(shí)可能須要重構(gòu),因此,索引越多,所花的時(shí)間越長(zhǎng)。假設(shè)有一個(gè)索引非常少利用或從不使用,那么會(huì)不必要地減緩表的改動(dòng)速度。此外,MySQL 在生成一個(gè)運(yùn)行計(jì)劃時(shí),要考慮各個(gè)索引,這也要費(fèi)時(shí)間。創(chuàng)建多余的索引給查詢優(yōu)化帶來了很多其它的工作。索引太多,也可能會(huì)使MySQL 選擇不到所要使用的最好索引。僅僅保持所需的索引有利于查詢優(yōu)化。假設(shè)想給已索引的表添加索引,應(yīng)該考慮所要添加的索引是否是現(xiàn)有多列索引的最左索引。假設(shè)是,則就不要費(fèi)力去添加這個(gè)索引了,由于已經(jīng)有了。
? ? ? ? 6. 考慮在列上進(jìn)行的比較類型。索引可用于“ <”、“ < = ”、“ = ”、“ > =”、“ >”和BETWEEN 運(yùn)算。在模式具有一個(gè)直接量前綴時(shí),索引也用于LIKE 運(yùn)算。假設(shè)僅僅將某個(gè)列用于其它類型的運(yùn)算時(shí)(如STRCMP( )),對(duì)其進(jìn)行索引沒有價(jià)值。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
