統一使用INNODB引擎數據表名和字段名使用小寫字母加下劃線的格式,使數據表名和字段名盡可能的短,但是要盡量體現表和字段的含義,例如在school表中使用name字段名而不是school_name字段名。屬於固定模塊的表要加對應的前綴。
只要能滿足你的需求,應盡可能使用更小的數據類型:例如使用MEDIUMINT代替INT。
盡量把所有的列設置為NOT NULL,這會運行的更快,而且每個字段都會節省1個bit。如果在應用程序中確實需要用到 NULL,那麼就明確的指定它。不過要避免所有的字段默認值是 NULL。
盡量使用定長的字段類型,雖然存儲空間比變長類型大,但是查詢速度快。變長字段類型包括VARCHAR、TEXT、BLOB。
如果你的數據只有你所知的少量的幾個。最好使用ENUM類型。
例如,對於出現在WHERE,ORDER BY,GROUP BY等語句後的定長字段建立索引,
對經常同時查詢的字段建立聯合索引,
字符類型的字段索引值大部分情況下只需要對其一部分建立索引,例如,"CREATE INDEX char_idx ON tbl1 ( name(10) );"。
注意的是,MySQL只對 <,<=,=,>,>=,BETWEEN,IN,以及某些時候的like(like "aaaaa%")才會使用索引,
如果有一個多字段索引,則查詢時,必須按照索引順序來使用,否則該索引不會用到.例如:索引 idx(col1, col2, col3),那麼查詢 SELECT .... FROM ... WHERE col1=1 AND col2=2; 使用索引,而查詢 ... WHERE col2=2 AND col3=3; 或 ... WHERE col1=1 AND col3=3; 則不使用索引。
有些特殊情況下,MySQL自己選擇的索引並不一定是最適合的,可以自己根據情況在SQL語句中指定使用某個索引(使用“use index” 語句)。
另外,不要建立不必要的索引,這樣會給INSERT以及UPDATE語句帶來不必要的開銷。
如果不是需要所有字段,盡量不要使用“SELECT *”這樣的形式,盡量指定需要返回的字段,以提高返回數據的速度。構造SQL語句時,盡量把一次能過濾掉更多記錄的條件放在其他條件的前面盡量不要在SQL語句中進行運算操作,因為這樣的話就無法使用可能存在的索引,並且無論如何都會極大地降低效率,例如取時間盡量不使用“=now()”這樣的操作,正確的做法是在程序中運算後直接傳遞最終結果給SQL語句。針對Innodb表,盡量不執行 SELECT COUNT(*) 語句,因為Innodb表沒有類似MyISAM那樣的內部計數器來記錄表記錄總量,執行這個操作將會全表掃描,速度很慢,如果count(*)是不能避免的操作,有個技巧是在where中加上對該表第二索引(一般id為第一個索引)的查詢條件,因為INNODB的主鍵索引是和數據保存在一起的,而第二索引是單獨保存的。使用 LOAD DATA,而不是使用大批量的 INSERT 語句來導入數據. 可以使用explain來查看SQL語句運行的相關信息,包括如何使用索引等。