MySQL SQL性能優化筆記

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章