mysql 性能优化

本文借鉴地址

避免向数据库查询不需要的数据

  • 查询只需要的行和列,不需要的会增加开销
  • 如果多次请求一行数据,可进行缓存,使用变量代替语句再次查询
  • 避免使用select * 进行查询 ,需要什么取什么
  • 分页查询,limit限制每次返回条数
  • 如果是查询一条语句,使用limit 1 进行限制

分解大的查询

  • 将大的查询分解成小查询
  • 将关联查询分解,先进行单表查询,最后将结果进行关联
  • 分解关联查询的优点:
    • 增加缓存的效率,如果关联查询,如果其中一个变化,会导致全部缓存失效,单表则只不然
    • 减少锁
    • 增加查询的效率
    • 更容易对数据库进行拆分,更容易做到高性能以及可拆分

查询数据的方式

  • 查询数据的方式有全表扫描,索引扫描,范围扫描,唯一索引查询,常数引用等,速度从慢到快,扫描行从多到少
  • 可以通过EXPLAIN语句检查查询语句效率进行选择
  • 通过增加合适的索引改善查询数据方式,减少扫描的数据行,例如 在某表中如果某个字段总是被用来做搜索,可以为其建索引,但是当需要在一篇大文章中搜一个词时,索引可能没意义

优化关联查询

  • 要确保ON或者USING子句中的列上有索引,并且在建立索引时需要考虑到关联的顺序
  • 确保任何的GROUP BY和ORDER BY中的表达式只涉及到一个表中的列

优化LIMIT分页

  • 当处理分页时,页数靠后时,偏移量非常大,此时的limit效率非常低,例如 limit(1000,10),优化此类查询最简单的办法就是尽可能地使用索引覆盖扫描,而不是查询所有的列。然后根据需要与原表做一次关联操作返回所需的列。
SELECT chen.id, `desc` FROM user
INNER JOIN 
( SELECT id FROM user LIMIT 1000,10) AS chen 
USING(id); 
// 如果id为索引,通过索引搜索查询速度较快,先通过id查出1000-1010 这十条数据,再去关联本表,获取desc,返回相应的结果

其他优化

  • 除非确实需要服务器消除重复的行,否则一定要使用UNION ALL

  • 尽可能用关联替换子查询,可以提高查询效率。

  • 尽量让MySql使用索引进行排序

  • 用IN()取代OR

  • 添加索引可以**优化MIN()和MAX()**表达式

  • 当使用COUNT(*)时,统计的是行数,它会忽略所有的列而直接统计所有的行数。而在括号中指定了一个列的话,则统计的是这个列上值不为NULL的个数。可以考虑使用索引覆盖扫描或增加汇总表对**COUNT()**进行优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值