php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 619|回复: 0

慢查询优化1-6

[复制链接]

2672

主题

2679

帖子

9503

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
6709
贡献
0
注册时间
2021-4-14
最后登录
2024-5-19
在线时间
674 小时
QQ
发表于 2022-3-6 15:55:18 | 显示全部楼层 |阅读模式
目录
慢查询优化
1.查询语句的注意事项
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
3.创建索引注意事项
4.使用聚集索引和非聚集索引
5.常见慢查询优化方案
6.你们是怎么做sql优化的?
慢查询优化
1.查询语句的注意事项
1.尽量使用简单的查询,避免使用表链接,请尽量避免全表扫描,包括但不限于: where子句条件横真或为空
2.使用LIKE
3.使用不等操作符(<>、!=)
4.查询含义is null的列
5.在非索引列上使用or
6.多条件查询时,请把简单查询条件或索引列查询置于前面,
7.尽量指定需要查询的列,不要偷懒使用select * 如果不指定,一方面会返回多余的数据,占用宽带等 另一方面MySQL执行查询的时候,没有字段时会先去查询表结构有哪些字段大写的查询关键字比小写快一点点 使用子查询会创建临时表,会比链接(JOIN)和联合(UNION)稍慢
8.在索引字段上查询尽量不要使用数据库函数,不便于缓存查询结果
9.当只要一行数据时,请使用LIMIT 1,如果数据过多,请适当设定LIMIT,分页查询 千万不要 ORDER BY RAND(),性能极低
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
[mw_shl_code=applescript,true]select id from t where num is null
        可以在num上设置默认值0,确保表中num列没有null值
        然后这样查询: select id from t where num=0
[/mw_shl_code]
3.创建索引注意事项
# 创建时注意
        1.一般来说,每张表都需要有一个主键id字段
        2.常用于查询的字段应该设置索引
        3.varchar类型的字段,在建立索引的时候,最好指定长度
  4.查询有多个条件时,优先使用具有索引的条件
  5.像LIKE条件这样的模糊搜索对于字段索引是无效的,需要另外建立关键词索引来解决
  6.请尽量不要在数据库层面约束表和表之间的关系,这些表之间的依赖应该在代码层面去解决
4.使用聚集索引和非聚集索引
image.png
5.常见慢查询优化方案
[mw_shl_code=applescript,true]mysql中最常见的慢查询优化方案是什么?
1.加索引,优化索引。
2.在where和order by 列上加索引
3.减少where 字段值null判断
        SELECT * FROM m_user where type = null
        改为:
        SELECT * FROM m_user where type = 0
4.应尽量避免在 where 子句中使用!=或<>操作符
5.应尽量避免在 where 子句中使用 or 来连接条件
        SELECT * FROM "tb_real_time_car" where pay_status != null or enter_time = null;
        改为:union连表操作
        SELECT * FROM "tb_real_time_car" where pay_status != null union all SELECT * FROM "tb_real_time_car" where enter_time = null;
6.in 和 not in 也要慎用
        SELECT * FROM "tb_real_time_car" where rowed in [1,2,3,4];
        改为:
        SELECT * FROM "tb_real_time_car" where rowed between 1 and 5;
7.少使用模糊匹配 like
8.应尽量避免在 where 子句中对字段进行表达式操作
        SELECT * FROM "tb_real_time_car" where rowid/4 =100;
        改为:
        SELECT * FROM "tb_real_time_car" where rowid =4*100;
9.不要在条件判断时进行算数运算
10.很多时候用 exists代替 in 是一个好的选择
        SELECT * FROM "tb_real_time_car" where rowed in (select rowed from "tb_real");
        改为:
        替换为SELECT * FROM "tb_real_time_car" where exists (select rowed from "tb_real" where rowed = tb_real.rowid)
11.尽量使用前戳索引
        字符串类型,截取前面字符串长度为索引
12.使用索引扫描进行排序
13.union all,in,or都能够使用索引,但是推荐使用in
14.强制类型转换会全表扫描
15.尽量不允许为空,默认值0,或者其他
16.能使用limitd的时候尽量使用limit
17.单表索引建议控制在5个以内
18.单索引字段数不允许超过5个(组合索引)
19.不要过早优化,在不了解系统的情况下进行优化
[/mw_shl_code]
6.你们是怎么做sql优化的?
一般来说,针对sql的优化都是在业务代码开发前就要做好的,除了基本的表字段设计,在开发的过程还要针对业务方法输出对应的sql语句,然后做好对应的sql review以及explain分析,同时还要考虑到业务的访问量,如果过高的情况下是否需要走强制索引之类的优化





上一篇:什么是NFT?
下一篇:python 中的迭代器和生成器简单介绍
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-5-19 19:42 , Processed in 0.158586 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表