性能优化

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 子句中使用参数,也会导致全表扫描。
  • ...
Last modification:March 19th, 2021 at 02:54 pm
我从来都不喜欢钱,我也没碰过钱,我对钱没兴趣