MySQL优化

MySQL基本优化方法

  1. 查询语句中不要使用select *
  2. 尽量减少子查询,使用关联查询(left join,right join,inner join)替代
  3. 减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代
  4. or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时,union all会更好)
  5. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
  6. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0。
  7. 建索引。
  8. 不要在列上进行运算。select * from users where YEAR(adddate)<2007;将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成select * from users where adddate<‘2007-01-01’;
  9. 排序的索引问题。mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
  10. 索引不会包含有NULL值的列。只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
  11. 尽量避免在字段开头like模糊查询,会导致数据库引擎放弃索引进行全表扫描。
  12. 尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。如SELECT * FROM T WHERE score/10 = 9改为SELECT * FROM T WHERE score = 10*9。
  13. 多表关联查询时,小表在前,大表在后。因为执行 from 后的表关联查询是从左往右执行的(Oracle相反)。

大表如何处理

  1. 写查询SQL时务必不能写没带任何查询条件的SQL。
  2. 数据库拆分,读写分离,主库负责写,从库负责读。
  3. 垂直拆分,即将一张大表拆成两张小表。
  4. 水平分区,对存储数据进行数据分片,即保持数据结构不变,将一张表的数据存放在不同的表或者库中(具体如何实现还未了解,只是知道有这么一种方法)。
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信