表結構
CREATE TABLE single_table(
id int not null auto_increment,
key1 VARCHAR(100),
key2 int,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY(id),
key idx_key1(key1),
unique key uk_key2(key2),
key idx_key3(key3),
key idx_key_part(key_part1,key_part2,key_part3)
)engine=INNODB charset=utf8mb4
只為用於搜索、排序或分組的列創建索引
我們只為出現在where子句中的列、連接子句中的連接列,或者出現在ORDER BY或者GROUP BY子句中的列創建索引。僅出現在查詢列表中的列就沒必要建立索引。比如這樣一個查詢語句:
SELECT common_field,key_part3 FROM single_table WHERE key1 = 'a';
查詢列表中的common_field、key_part3這兩個列就沒必要創建索引。我們只需要為出現在WHERE字句中的key1列創建索引就可以了。
考慮索引列中不重複值的個數
在通過二級索引進+回表的方式執行查詢時,某個掃描區間中包含的二級索引記錄數量越多,就會導致回表操作的代價越大。我們在為某個列創建索引時,需要考慮列中不重複值的個數佔全部記錄條數的比例。如果比例太低,則説明該列包含過多的重複值,那麼在通過二級索引+回表的方式執行查詢時,就有可能執行太多次回表操作。
索引的類型儘量小
能使用INT就不要使用BIGINT。因為數據類型越小,索引佔用的存儲空間就越少,在一個數據頁就可以存放更多的記錄,磁盤I/O帶來的性能損耗也就越小(一次頁面I/O就可以將更多的記錄加載到內存中),讀寫效率也就越高。
這個建議對於表的主鍵來説更加適用,因為不僅聚簇索引會存儲主鍵值,其他所有的二級索引的節點都會存儲一份記錄的主鍵值。如果主鍵使用更小的數據類型,也就意味着能節省更多的存儲空間。