性能优化
1.表的设计合理化,符合三大范式(3NF)
- 1NF.属性的原子性约束,要求属性(列)具有原子性,不能再分解。(关系型数据库都满足1NF)
- 2NF.对记录的唯一性约束,要求记录有唯一标识,即实体的唯一性。
- 3NF.对字段冗余性的约束,字段没有冗余,即每列都与主键直接相关。
2.添加适当的索引(index)
[普通索引、主键索引、唯一索引、全文索引]
- 在经常需要查询的列上添加索引。
- 唯一性太差的列不适合添加索引。
- 更新频繁的列不适合创建索引。
- 不会出现在WHERE句子中的字段不该创建索引。
3.分库分表(水平分割、垂直分割)
4.读写(update/delete/add)分离
5.存储过程 [模块化编程,可以提高速度]
6.对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]
7.mysql服务器硬件升级
8.定时的去清除不需要的数据,定时进行碎片整理(MyISAM)
SQL语句优化
- 通过show status命令了解各种SQL的执行频率。
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引。
- 应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,创建表时 NULL 是默认值,但大多数时候应该使用 NOT NULL,或者使用一个特殊的值,如 0,-1 作为默认值。
- 应尽量避免在 WHERE 子句中使用 != 或 <> 操作符。MySQL 只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的 LIKE。
- 应尽量避免在 WHERE 子句中使用 OR 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,可以使用 UNION 合并查询:select id from t where num=10 union all select id from t where num=20。
- IN 和 NOT IN 也要慎用,否则会导致全表扫描。对于连续的数值,能用 BETWEEN 就不要用 IN:select id from t where num between 1 and 3。
- 下面的查询也将导致全表扫描:select id from t where name like‘%abc%’ 或者select id from t where name like‘%abc’若要提高效率,可以考虑全文检索。而select id from t where name like‘abc%’才用到索引。
- 如果在 WHERE 子句中使用参数,也会导致全表扫描。
- ...