Mysql 索引與優化

索引是一種特殊的文件(InnoDB 數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏的全部記錄的引用指針
更通俗的說,數據庫索引就比如一本書的目錄,可以加快數據庫的查詢速度數據庫

普通索引

這是這基本的索引,它沒有任何限制,MyISAM 中默認的 B-tree 類型的索引函數

# 直接建立索引
CREATE INDEX index_name ON table(column(length))

# 修改表結構的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length))

# 建立表的時候同時建立索引
CREATE TABLE table_name ( \*,INDEX index_name title(length))

# 刪除索引
DROP INDEX index_name ON table

惟一索引

與普通索引一致,不一樣的是索引值必須惟一,容許有空值優化

# 直接建立索引
CREATE UNIQUE INDEX index_name ON table(column(length))

# 修改表結構的方式添加索引
ALTER TABLE table_name ADD UNIQUE INDEX index_name ON (column(length))

# 建立表的時候同時建立索引
CREATE TABLE table_name ( \*,UNIQUE index_name title(length))

全文索引

FULLTEXT 索引僅 MyISAM 引擎支持
他們能夠從CHAR、VARCHAR或TEXT列中做爲CREATE TABLE語句的一部分被建立,或是隨後使用ALTER TABLE 或CREATE INDEX被添加
不過切記對於大容量的數據表,生成全文索引是一個很是消耗時間很是消耗硬盤空間的作法指針

# 直接建立索引
CREATE FULLTEXT INDEX index_content ON article(content)

# 修改表結構的方式添加索引
ALTER TABLE article ADD FULLTEXT index_content(content)

# 建立表的時候同時建立索引
CREATE TABLE table_name ( \*,FULLTEXT (content))

組合索引(最左前綴)

平時用的SQL查詢語句通常都有比較多的限制條件,因此爲了進一步榨取MySQL的效率,就要考慮創建組合索引。
ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))
創建這樣的組合索引,實際上是至關於分別創建了下面兩組組合索引:
–title,time
–titlecode

索引優化

  • 應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描,如:
    select id from t where num is null索引

  • 能夠在num上設置默認值0,確保表中num列沒有null值,而後這樣查詢:
    select id from t where num=0it

  • 應儘可能避免在 where 子句中使用!=或<>操做符,不然將引擎放棄使用索引而進行全表掃描。優化器將沒法經過索引來肯定將要命中的行數,所以須要搜索該表的全部行。io

  • 應儘可能避免在 where 子句中使用 or 來鏈接條件,不然將致使引擎放棄使用索引而進行全表掃描,如:
    select id from t where num=10 or num=20table

  • 能夠這樣查詢:
    select id from t where num=10
    union all
    select id from t where num=20效率

  • in 和 not in 也要慎用,由於IN會使系統沒法使用索引,而只能直接搜索表中的數據。如:
    select id from t where num in(1,2,3)

  • 對於連續的數值,能用 between 就不要用 in 了:
    select id from t where num between 1 and 3

  • 儘可能避免在索引過的字符數據中,使用非打頭字母搜索。這也使得引擎沒法利用索引。
    見以下例子:
    SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
    SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
    SELECT * FROM T1 WHERE NAME LIKE ‘L%’

  • 即便NAME字段建有索引,前兩個查詢依然沒法利用索引完成加快操做,引擎不得不對全表全部數據逐條操做來完成任務。而第三個查詢可以使用索引來加快操做

  • 應儘可能避免在 where 子句中對字段進行表達式操做,這將致使引擎放棄使用索引而進行全表掃描

  • 應儘可能避免在where子句中對字段進行函數操做,這將致使引擎放棄使用索引而進行全表掃描

  • 不要在 where 子句中的「=」左邊進行函數、算術運算或其餘表達式運算,不然系統將可能沒法正確使用索引

相關文章
相關標籤/搜索