MySQL索引優化

寫在前面:html

索引對查詢的速度有着相當重要的影響,理解索引也是進行數據庫性能調優的起點。考慮以下狀況,假設數據庫中一個表有10^6條記錄,DBMS的頁面大小爲4K,並存儲100條記錄。若是沒有索引,查詢將對整個表進行掃描,最壞的狀況下,若是全部數據頁都不在內存,須要讀取10^4個頁面,若是這10^4個頁面在磁盤上隨機分佈,須要進行10^4次I/O,假設磁盤每次I/O時間爲10ms(忽略數據傳輸時間),則總共須要100s(但實際上要好不少不少)。若是對之創建B-Tree索引,則只須要進行log100(10^6)=3次頁面讀取,最壞狀況下耗時30ms。這就是索引帶來的效果,不少時候,當你的應用程序進行SQL查詢速度很慢時,應該想一想是否能夠建索引。數據庫

進入正題:
緩存

第二章、索引與優化ide

一、選擇索引的數據類型性能

MySQL支持不少數據類型,選擇合適的數據類型存儲數據對性能有很大的影響。一般來講,能夠遵循如下一些指導原則:優化

(1)越小的數據類型一般更好:越小的數據類型一般在磁盤、內存和CPU緩存中都須要更少的空間,處理起來更快。
(2)簡單的數據類型更好:整型數據比起字符,處理開銷更小,由於字符串的比較更復雜。在MySQL中,應該用內置的日期和時間數據類型,而不是用字符串來存儲時間;以及用整型數據類型存儲IP地址。
(3)儘可能避免NULL:應該指定列爲NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優化,由於它們使得索引、索引的統計信息以及比較運算更加複雜。你應該用0、一個特殊的值或者一個空串代替空值。

1.一、選擇標識符
選擇合適的標識符是很是重要的。選擇時不只應該考慮存儲類型,並且應該考慮MySQL是怎樣進行運算和比較的。一旦選定數據類型,應該保證全部相關的表都使用相同的數據類型。
(1)    整型:一般是做爲標識符的最好選擇,由於能夠更快的處理,並且能夠設置爲AUTO_INCREMENT。

(2)    字符串:儘可能避免使用字符串做爲標識符,它們消耗更好的空間,處理起來也較慢。並且,一般來講,字符串都是隨機的,因此它們在索引中的位置也是隨機的,這會致使頁面分裂、隨機訪問磁盤,聚簇索引分裂(對於使用聚簇索引的存儲引擎)。spa

二、索引入門
對於任何DBMS,索引都是進行優化的最主要的因素。對於少許的數據,沒有合適的索引影響不是很大,可是,當隨着數據量的增長,性能會急劇降低。
若是對多列進行索引(組合索引),列的順序很是重要,MySQL僅能對索引最左邊的前綴進行有效的查找。例如:
假設存在組合索引it1c1c2(c1,c2),查詢語句select * from t1 where c1=1 and c2=2可以使用該索引。查詢語句select * from t1 where c1=1也可以使用該索引。可是,查詢語句select * from t1 where c2=2不可以使用該索引,由於沒有組合索引的引導列,即,要想使用c2列進行查找,必需出現c1等於某值。
htm


http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.htmlblog

相關文章
相關標籤/搜索