数据库常用优化–MySQL优化【方法+解析】
数据库优化:
-
选择最合适的字段属性-- 数据库中的表越小,在它上面执行的查询速度也就越快。
-
尽量把字段设置为NOT NULL-- 这样在将来执行查询的时候,数据库不用去比较NULL值。
-
使用连接(JOIN)来代替子查询-- 接(JOIN)之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作。
-
使用联合(UNION)来代替手动创建的临时表-- 可以把需要使用临时表的两条或更多的select查询合在一个查询中,提高查询效率。
-
使用索引-- 普通索引、主键索引、唯一索引(索引应该建立在那些将用于join,where判断和orderby排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引)
-
使用事务-- 作用是要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中的数据的一致性和完整性。
数据库事务(一系列逻辑相关的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。)
四个特征ACID:
1.原子性( Atomicity ):事务是一个完整的操作,要么都成功,要么都失败。
2.一致性( Consistency ):事务完成时,数据必须处于一致状态。
3.隔离性( Isolation ):对数据进行修改的所有并发事务是彼此隔离的。一个事务的执行不能干扰其它事务。
4.永久性( Durability ):指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,不能回滚。
查询语句优化:
- 不使用子查询 – 不需要创建临时表完成查询
- 避免函数索引 – 由于MySQL不像Oracle那样支持函数索引,会直接全表扫描。
- 减少使用OR、IN或者NOT IN ,使用exists,not exists或者关联查询语句替代 – OR算法复杂度高
- LIKE双百分号无法使用到索引 避免在 where 子句中使用!=或<>操作符,无法使用到索引
- 读取适当的记录LIMIT M,N – WHERE 1 LIMIT 10;
- 避免数据类型与实际值不一致
- 分组统计可以禁止排序 – 默认情况下,MySQL对所有GROUP BY col1,col2…的字段进行排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。
- 避免随机取记录 – 由于MySQL不像Oracle那样支持函数索引,会直接全表扫描。
- 禁止不必要的ORDER BY排序
- 使用批量INSERT插入效率更高
- 查询语句中不要使用select * – select * 数据库需要解析更多的 对象,字段,权限,属性相关,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担select * 数据库需要解析更多的 对象,字段,权限,属性相关,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。
有什么疑问可评论区提问!