MySQL SQL性能優化筆記
1.最近對項目優化,發現用SQL語句鏈接表查詢,若用in,若超過40000萬則死。建議用left join等連接查詢。
2.關於索引優化及使用
3、優化數據庫---索引:
(1)儘可能地使用最有效(最小)的數據類型。MySQL有很多節省磁盤空間和內存的專業化類型。
(2)儘可能使用較小的整數類型使表更小。例如,MEDIUMINT經常比INT好一些,因爲MEDIUMINT列使用的空間要少25%。
(3)如果可能,聲明列爲NOT NULL。它使任何事情更快而且每列可以節省一位。注意如果在應用程序中確實需要NULL,應該毫無疑問使用它,只是避免 默認地在所有列上有它。
(4)對於MyISAM表,如果沒有任何變長列(VARCHAR、TEXT或BLOB列),使用固定尺寸的記錄格式。這比較快但是不幸地可能會浪費一些空間。
(5)只創建你確實需要的索引。索引對檢索有好處,但是當你需要快速存儲東西時就變得糟糕。如果主要通過搜索列的組合來存取一個表,對它們做一個索引。第一個索引部分應該是最常用的列。如果從表中選擇時總是使用許多列,應該首先以更多的副本使用列以獲得更好的索引壓縮。
(6)如果很可能一個索引在頭幾個字符上有唯一的前綴,僅僅索引該前綴比較好。MySQL支持對一個字符列的最左邊部分創建一個索引。更短的索引會更快,不僅因爲它們佔較少的磁盤空間,而且因爲它們將在索引緩存中提供更多的訪問,因此磁盤搜索更少。
(7)創建索引:
CREATE [UNIQUE|FULLTEXT] INDEX index_name
ON tbl_name (col_name[(length)],... )
舉例如下:
CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name) ); name索引是一個對last_name和first_name的索引。索引可以用於爲last_name,或者爲last_name和first_name在已知範圍內指定值的查詢。因此,name索引用於下面的查詢: SELECT * FROM test WHERE last_name='Widenius';
SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael';
SELECT * FROM test WHERE last_name='Widenius' AND (first_name='Michael' OR first_name='Monty');
SELECT * FROM test WHERE last_name='Widenius' AND first_name >='M' AND first_name < 'N'; 然而,name索引不用於下面的查詢: SELECT * FROM test WHERE first_name='Michael';
SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';
|
再如:
SELECT * FROM tbl_name WHERE col1=val1; SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
SELECT * FROM tbl_name WHERE col2=val2; SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
如果 (col1,col2,col3)有一個索引,只有前2個查詢使用索引。第3個和第4個查詢確實包括索引的列,但(col2)和(col2,col3)不是 (col1,col2,col3)的最左邊的前綴。
|
例子3:
也可以在表達式通過=、>、>=、<、<=或者BETWEEN操作符使用B-樹索引進行列比較。如果LIKE的參數是一個不以通配符開頭的常量字符串,索引也可以用於LIKE比較。例如,下面的SELECT語句使用索引: SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%'; 在第1個語句中,只考慮帶'Patrick' <=key_col < 'Patricl'的行。在第2個語句中,只考慮帶'Pat' <=key_col < 'Pau'的行。 下面的SELECT語句不使用索引: SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE other_col; 在第一條語句中,LIKE值以一個通配符字符開始。在第二條語句中,LIKE值不是一個常數。 如果使用... LIKE '%string%'並且string超過3個字符,MySQL使用Turbo Boyer-Moore算法初始化字符串的模式然後使用該模式來更快地進行搜索。 |
(8)刪除索引:
DROP INDEX index_name ON tbl_name