1.要有好的表結構
時間類型用int存儲
參考阿里mysql手冊
2.作爲條件的字段要加索引 where,order by group by 等,避免全表掃描,臨時表
3.重複、冗餘的索引要清除 (information_schema),或使用pt-duplicate-key-checker工具
SELECT a.TABLE_SCHEMA 數據名,a.TABLE_NAME 表名,a.INDEX_NAME 索引1,b.INDEX_NAME 索引2,a.COLUMN_NAME 重複列名 FROM STATISTICS a JOIN
STATISTICS b ON a.TABLE_SCHEMA=b.TABLE_SCHEMA AND a.TABLE_NAME=b.TABLE_NAME
AND a.SEQ_IN_INDEX=b.SEQ_IN_INDEX AND a.COLUMN_NAME=b.COLUMN_NAME
WHERE a.SEQ_IN_INDEX=1 AND a.INDEX_NAME<>b.INDEX_NAME
4.limit偏移量高時需優化(索引覆蓋)
5.使用聯合索引時,把離散度 [select count(distinct col) from table] 高的字段放到前面 列: index_lh(col2,col1) col2離散度高,能夠快速檢索出結果
6.使用explain查看sql執行計劃
其他優化案例:
- in中子查詢使用union all關聯 索引失效
SELECT
*
FROM
t1
WHERE
num IN (
SELECT
num
FROM
t2
WHERE
id IN ('')
UNION ALL
SELECT
num
FROM
t3
WHERE
num IN (
SELECT
num
FROM
t2
WHERE
id IN ('')
)
);
改爲 內連接 等價與in子查詢
SELECT
*
FROM
t1 ,(
SELECT
num
FROM
t2
WHERE
id IN ('')
UNION ALL
SELECT
numm AS num
FROM
t3
WHERE
num IN (
SELECT
num
FROM
t2
WHERE
id IN ('')
)
) t
WHERE
t1.num=t.num;