1. 查詢快取(相同的查詢執行多次的時候,查詢結果會被快取)
// 查詢快取不開啟
$r = mysql_query("select username from user where signup_date >= curdate()");
// 開啟查詢快取
$today = date("y-m-d");
$r = mysql_query("select username from user where signup_date >= '$today'");
2. 明知只會有一條結果時,使用limit 1, 查詢會提前終止
3. 使用索引(後面細說)
4. 避免select * (後面解釋)
5. 設定乙個唯一id,即使你可能不用
6. 根據情況是用""與null, 然後大部分情況請保持欄位not null
7. 游標的使用
8. 小的,固定的自然就快(垂直劃分,使用int,避免varchar,text等)
9. delete,insert量大需要拆分,避免長時間鎖表
while 1:
effect_row = db.execute(delete from act where f_date < '2009' limit 1000)
if effect_row == 0: break
sleep(0.001)
10. 如果可以,用 group by 代替 distinct
mysql查詢優化器:
1. 最主要的:盡可能的使用索引,並且利用索引排除盡可能多的行
2. 其次匹配資料行
explain詳解:
id: 值越大,優先順序越高
select_type:
******: 簡單select 無子查詢, 無union
primary:
union:
dependent union:
subquery
dependent subquery:
derived:
where category_id = 1 and comments > 1 order by views desc
聯合索引:alter table `article` add index x ( `category_id` , `comments`, `views` );
views 的排序會利用不到順序,因為comments是乙個範圍(range), 辦法: comments不加聯合索引即可
b+tree解釋索引順序問題(最左字首原理與相關優化)
單一索引與聯合索引區別
ANSI C一些常識記錄
switch 的 fall through 如果case語句後面不叫break,就一次執行下去,以滿足某些特殊的情況的要求。switch 內部的任何語句都可以加上標籤。這個特性一般不適用,會破壞程式的結構化。switch 的default不一定放在末尾,放在末尾是習慣問題。當default在中間的時...
mysql一些記錄
1 mysql varchar 50 到底能存多少個漢字 mysql 4.0版本以下,varchar 50 指的是50位元組,如果存放utf8漢字時,只能存放16個 每個漢字3位元組 mysql 5.0版本以上,varchar 50 指的是50字元,無論存放的是數字 字母還是utf8漢字 每個漢字3...
mysql的一些基本常識
1.主鍵的選取 主鍵的字段不能有null存在 主鍵應該使用bigint自增,而不是int 主鍵的選取預設為id 聯合主鍵 就是多個欄位被設定為主鍵,這裡主鍵欄位的值是允許相同的,只要不是所有字段相同即可 聯合主鍵不常用,它給關係表帶來了複雜度的提公升 我至今沒用過,好菜 一些簡單常用的操作 資料庫的...