MYSQL使用索引的方法
作者:vicki 2006-12-05 16:46:51
標簽: | ||||
如何建立索引
· 索引通常被用于提高WHERE條件的數(shù)據(jù)行匹配或者執(zhí)行聯(lián)結(jié)操作時匹配其它表的數(shù)據(jù)行的搜索速度。所以我們選擇索引的列也通常選擇出現(xiàn)在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。
· 選擇索引時,需要考慮數(shù)據(jù)列的基數(shù)。所謂基數(shù),是指數(shù)據(jù)列所包含的不同的數(shù)據(jù)的個數(shù)。如果基數(shù)相對于數(shù)據(jù)表行數(shù)較高的話,索引的效果比較好。換句話說,就是指數(shù)據(jù)列的不同的值越多,索引效果越好。如果一個數(shù)據(jù)列只包含:0或者1兩個值的話,索引的用處就不大。如果值出現(xiàn)的幾率幾乎相等,那么無論搜索哪個值都可能得到一半的數(shù)據(jù)行。在這些情況下,最好根本不要使用索引。
· 索引值較短的值,所選擇的數(shù)據(jù)類型也盡可能的要小一些。譬如:如果TEXT能滿足需求的話,我們就不需要用MEDIUTEXT。
· 如果建立聯(lián)合索引的話,譬如對:t1,t2,t3建立聯(lián)合索引的話,同時也是對t1和t1,t2建立了索引。但是如果單獨指定t2、t3、t1t3、t2t3的值的話,都會用不到索引。
sql語句中如何避免沒有使用索引的情況
首先先了解一下mysql優(yōu)化器的工作原理:MySQL查詢優(yōu)化器最主要的目標是盡可能地使用索引,并且使用最嚴格的索引來消除盡可能多的數(shù)據(jù)行。所以當我們提交查詢語句時,如果優(yōu)化器排除不符合條件的數(shù)據(jù)的速度越快,那么查詢的結(jié)果也會越快。
·盡量比較數(shù)據(jù)類型相同的數(shù)據(jù)列。例如,INT與BIGINT是不同的。CHAR(10)被認為是CHAR(10)或VARCHAR(10),但是與CHAR(12)或VARCHAR(12)不同。
·盡量不要在where子句中對索引列使用表達式或者函數(shù)。如果你在索引列使用函數(shù)調(diào)用或者更復(fù)雜的算術(shù)表達式,MySQL就不會使用索引,因為它必須計算出每個數(shù)據(jù)行的表達式值。
WHERE mycol < 4 / 2 使用索引
WHERE mycol * 2 < 4 沒有使用索引
WHERE mycol * 2 < 4 沒有使用索引
· 在使用LIKE時,盡量不要在開頭使用通配符。
WHERE col_name LIKE ’%string%’
WHERE col_name LIKE ’abc%’
· 不要使用類型轉(zhuǎn)換。如果某個索引列是int型,而在查詢時,賦值為字符型,將使用不了索引。
SELECT * FROM mytbl WHERE num_col = 1;使用索引
SELECT * FROM mytbl WHERE num_col = ‘1’;沒有使用索引
SELECT * FROM mytbl WHERE num_col = ‘1’;沒有使用索引
·在SELECT語句中可以使用STRAIGHT_JOIN關(guān)鍵字來重載優(yōu)化器的選擇。
SELECT STRAIGHT_JOIN ... FROM t1, t2, t3 ... ;
SELECT ... FROM t1 STRAIGHT_JOIN t2 STRAIGHT_JOIN t3 ... ;
SELECT ... FROM t1 STRAIGHT_JOIN t2 STRAIGHT_JOIN t3 ... ;
http://blog.sina.com.cn/s/reader_46599af7010006rv.html