MySQL优化

SQL查询的优化

  • 避免全表扫描,在where、order by涉及的字段上建立索引;

  • 避免使用select * 操作,劲量明确所要查询的字段;

  • SQL语句尽量大写,数据库在解析SQL语句时,通常会先转换成大写再执行 ,如:

    SELECT name FROM t WHERE id=1
    
  • 尽量避免在where字句中使用 != 或者<>,否则MySQL会放弃索引,全表扫描;MySQL只有在以下操作符时索引才生效:<、<=、=、>、>=、BETWEEN、IN、以及某些时候的LIKE(以xxx开头):

    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子句中写查询条件时把索引字段放在前面,如:
    mobile为索引字段,name为非索引字段

    推荐
    SELECT ... FROM t WHERE mobile='13911111111' AND name='python'
    不推荐
    SELECT ... FROM t WHERE name='python' AND mobile='13911111111' 
    
  • 建立了复合索引 key(a, b, c)

    推荐
    SELECT ... FROM t WHERE a=... AND b=... AND c= ...
    SELECT ... FROM t WHERE a=... AND b=...
    SELECT ... FROM t WHERE a=...
    不推荐 (字段出现顺序不符合索引建立的顺序)
    SELECT ... FROM t WHERE b=... AND c=...
    SELECT ... FROM t WHERE b=... AND a=... AND c=...
    
  • 能使用关联查询解决的尽量不要使用子查询,如

    子查询
    SELECT article_id, title FROM t_article WHERE user_id IN (SELECT user_id FROM t_user  WHERE user_name IN ('itcast', 'itheima', 'python'))
    关联查询(推荐)
    SELECT b.article_id, b.title From t_user AS a INNER JOIN t_article AS b ON a.user_id=b.user_id WHERE a.user_name IN ('itcast', 'itheima', 'python');
    
  • 能不使用关联查询的尽量不要使用关联查询;不需要获取全表数据的时候,不要查询全表数据,使用LIMIT来限制数据。

数据库优化

  • 在进行表设计时,可适度增加冗余字段(反范式设计),减少JOIN操作;

  • 多字段表可以进行垂直分表优化,多数据表可以进行水平分表优化;

  • 选择恰当的数据类型,如整型的选择;

  • 对于强调快速读取的操作,可以考虑使用MyISAM数据库引擎;

  • 对较频繁的作为查询条件的字段创建索引;唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;更新非常频繁的字段不适合创建索引;

  • 编写SQL时使用上面的方式对SQL语句进行优化;

  • 使用慢查询工具找出效率低下的SQL语句进行优化;

  • 构建缓存,减少数据库磁盘操作;

  • 可以考虑结合使用内在型数据库,如Redis,进行混合存储。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值