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;