1偏竟、為查詢緩存優(yōu)化 SQL 語句
Mysql數(shù)據(jù)庫引擎提供的查詢緩存功能可以有效提高性能寓免。當(dāng)很多相同的查詢執(zhí)行多次的時(shí)候,這些查詢的結(jié)果會(huì)被放到緩存中窖式,然后新的查詢就不需要訪問數(shù)據(jù)庫而是直接訪問緩存結(jié)果潮售。
有些 SQL 語句是不被緩存的
1)查詢緩存不開啟
$r = mysql_query("select * from um_user where gmt_create > CURDATE()")
其中的 CURDATE()函數(shù)的結(jié)果不會(huì)被緩存
2)開啟緩存查詢
$today = date("Y-m-h")
$r = mysql_query("select * from um_user where gmt_create > '$today'");
2痊项、Explain SQL 語句
檢查 rows,索引命中情況 keylen
3酥诽、當(dāng)只要一行數(shù)據(jù)時(shí)使用 limit 1鞍泉,比如一些 判斷是否有符合條件的語句,這樣mysql 引擎在查找到一條語句后就會(huì)停止搜索
4肮帐、為搜索字段建立索引咖驮,比如 like 'a%'边器,這種可以命中索引,而 '%a%'不能命中
5托修、為join 的字段建立索引忘巧,并且確保 join 的字段是相同類型。
6睦刃、總是給表設(shè)置一個(gè) id
7砚嘴、使用 ENUM 而不是 VARCHAR,ENUM在數(shù)據(jù)庫里是 tinyint
8涩拙、字段盡量使用 NOT NULL
9际长、Prepared statments 很像存儲(chǔ)過程,是運(yùn)行在后臺(tái)的SQL 語句集合吃环,可以檢查綁定變量,防止 SQL 注入洋幻,性能方面郁轻,采用二進(jìn)制傳輸,也有緩存功能
10文留、把 IP 地址存成 UNSIGNED INT好唯,INET_ATON()把字符串ip轉(zhuǎn)換成 整形,INET_NTOA()把整型ip轉(zhuǎn)換成字符串
11燥翅、表的垂直分割骑篙,表的字段數(shù)不要過多,按照邏輯分離
12森书、Insert 和 Delete 操作是會(huì)鎖表的靶端,所以如果影響數(shù)量比較多的時(shí)候需要分批執(zhí)行,用limit
13凛膏、Myisam 適合于大量查詢操作杨名,InnoDB適合比較多的寫操作,支持行鎖和事務(wù)猖毫。
14台谍、盡量使用ORM,可以有比較好的性能吁断,"Lazy Loading"趁蕊,只有需要取值的時(shí)候才會(huì)真正去做。SQL語句可能打包成事務(wù)執(zhí)行仔役。
15掷伙、索引與優(yōu)化:
1)選擇索引數(shù)據(jù)類型:小的數(shù)據(jù)類型;簡單的數(shù)據(jù)類型又兵,比如 整型優(yōu)于字符串炎咖,應(yīng)該用內(nèi)置日期類型存時(shí)間,用UINT 存Ip;盡量避免 NULL乘盼,因?yàn)镹ULL很難做查詢優(yōu)化升熊。
2)索引的順序問題