在mysql數據庫中,其實建索引也是一門學問,一個表中,索引並不是越多越好,而是適合你的業務才最重要。那麼建立索引的時候,我們應該從以下幾點去考量。
1. 索引字段越小越好,像varchar(10)肯定比text類型的效果要好。
2. 經常需要作為where、group by、order by等條件的時候,要為該字段建立索引。
3. 當要建立聯合索引的時候,離散度較大的列放到前面。打個比方,如果要建立一個姓名(name)和年齡(age)的聯合索引,肯定要把name放到前面(index(name,age)),因為age的范圍最多不會超過0-120(全世界沒幾個人能活到120歲以上吧),而name的情況就有成千上萬種了。放到前面的好處就是第一次就能篩掉一大批數據,這樣更有利查詢的效率。
4. 只給經常作為查詢條件的字段建立索引,因為索引並不是越多越好,多了首先會增加磁盤開銷,然後查詢的時候,mysql引擎也要去判斷該使用那個索引,再就是索引多了,對update、insert、delete的效率也會造成影響。
總之,建立索引的時候也要認真思考,才能讓表結構更加完美
MySQL何時使用索引
對一個鍵碼使用>, >=, =, <, <=, IF NULL和BETWEEN
SELECT * FROM table_name WHERE key_part1=1 and key_part2 > 5;
SELECT * FROM table_name WHERE key_part1 IS NULL;
當使用不以通配符開始的LIKE
SELECT * FROM table_name WHERE key_part1 LIKE 'jani%'
在進行聯結時從另一個表中提取行時
SELECT * from t1,t2 where t1.col=t2.key_part
找出指定索引的MAX()或MIN()值
SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10
一個鍵碼的前綴使用ORDER BY或GROUP BY
SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3
在所有用在查詢中的列是鍵碼的一部分時間
SELECT key_part3 FROM table_name WHERE key_part1=1
------------------------------------------------------------------------------------------------------------------------------------
MySQL何時不使用索引
如果MySQL能估計出它將可能比掃描整張表還要快時,則不使用索引。例如如果key_part1均勻分布在1和100之間,下列查詢中使用索引就不是很好:
SELECT * FROM table_name where key_part1 > 1 and key_part1 < 90
如果使用HEAP表且不用=搜索所有鍵碼部分。
在HEAP表上使用ORDER BY。
如果不是用鍵碼第一部分
SELECT * FROM table_name WHERE key_part2=1
如果使用以一個通配符開始的LIKE
SELECT * FROM table_name WHERE key_part1 LIKE '%jani%'
搜索一個索引而在另一個索引上做ORDER BY
SELECT * from table_name WHERE key_part1 = # ORDER BY key2