网站首页 > 知识剖析 正文
排查
explain中只关注type,key,rows,key 索引 rows 行数 type 接类型
EXPLAIN SELECT * FROM your_table WHERE condition;
慢查询->explain->index 慢查询日志
开启慢查询日志,查看慢查询的 SQLshow variables like '%slow_query_log_file%';
使用 show processlist 命令查看当前所有连接信息
通过 SHOW INDEX 验证索引 ,若 key 列为 NULL,表示未使用索引
index 是否缺失
sql 消耗资源并不多,但是突然之间有大量的 session 连进来导致 cpu 飙升,比如说限制连接数等
kill 掉这些占用线程,加索引、改 sql、改内存参数之后,再重新跑这些 SQL。
SQL 性能优化 explain 中的 type:至少要达到 range 范围级别,要求是 ref 普通的索引级别,
当 type=index 时,索引物理文件全扫,速度非常慢。
考虑接口返回值 前端送参数为空 或者格式不正确 类型不正确等送参数容错机制
sql优化
分页
防止sql注入--传参大部分使用"#{}",在数据库底层使用的是:被解析为"?
inner join 、left join、right join,优先使用inner join
如果是表关联查询,能用inner join等值连接就不用left join和right join,如果必须使用的话,尽量要以小表为驱动。inner join会对两个表进行优化提高性能,优先把小表放外边,大表放里边,而left join和right join不会重新调整顺序
尽量避免使用 select *,返回无用的字段会降低查询效率
控制字段长度
添加必要的索引
先过滤 where,后分组grounp by
union、in、or 都能够命中索引,建议使用 in or查询优化耗费的cpu比in多不是所有的or都命中索引
WHERE 子句用于在分组之前过滤行(在GROUP BY 子句之前),
而 HAVING 子句用于在分组之后过滤行。
用union all代替union ,union关键字可以获取排重后的数据,会把结果集中 重复的记录删掉
union all关键字,可以获取所有数据,包含重复的数据,且效率高于 UNION
批量操作
性能优化
一主多从集群部署
服务器优化(增加 CPU、内存、网络、更换高性能磁盘)
路由策略
负载均衡策略
服务降级策略
多线程
批量操作数据入库
异步处理
reids作缓存
全局异常处理
索引的类型--索引就是单独的 值进行排序的
常见的索引类型 --B+树索引 Hash索引
根据索引功能分类 普通索引 唯一索引 主键索引 联合索引
按存储结构分类 聚集索引 非聚集索引
索引失效的情况和解决方法
避免为"大字段"建立索引 选择区分度大的列作为索引 选择ORDER BY 和 GROUP BY 后面的字段建立索引
1. 尽量避免在字段开头模糊查询, 会全表扫描
SELECT * FROM user WHERE name LIKE '%用%'
解决方法在字段后面使用模糊查询 SELECT * FROM user WHERE name LIKE '用%'
2尽量避免使用in 和not in,会导致引擎走全表扫描 解决方法可以用between代替
3尽量避免使用 or,会全表扫描 解决方法 可以用union(且)代替or
5 尽量避免进行null值的判断,会全表扫描
解决方法可可以给字段添加默认值0,对0值进行判断
select * from user WHERE age = 0
5.尽量避免在where条件中等号的左侧进行表达式、函数操作
可以将表达式、函数操作移动到等号右侧 ( 不建议这样写会造成运行效率降低 )
-- 全表扫描
SELECT * FROM user WHERE age/10 = 9
-- 走索引
SELECT * FROM user WHERE age = 10*9
6. where条件仅包含复合索引非前置列
如下:复合(联合)索引包含a1,b2,c3三列,但SQL语句没有包含索引前置列"a1",按照MySQL联合索引的最左匹配原则,不会走联合索引
7. 隐式类型转换造成不使用索引 字符串与数字比较不走索引:
如下SQL语句由于索引对列类型为varchar,但给定的值为数值,涉及隐式类型转换,造成不能正确走索引。
select name from table where name = 123;
8正则表达式不使用索引。
9不要在列上进行运算 select * from users where YEAR(adddate)<2007;
改成 select * from users where adddate<‘2007-01-01’;
10NOT IN和<>会全表扫描 NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替
猜你喜欢
- 2025-05-11 产品切换数据库问题处理总结(切换数据库的命令是什么)
- 2025-05-11 真正让你明白Hive参数调优系列1:控制map个数与性能调优参数
- 2025-05-11 拉链表(拉链表取数)
- 2025-05-11 常见的数据库类型有哪些 & SQL介绍
- 2025-05-11 每日SQL自学知识点(第八天)—多表查询详解
- 2025-05-11 大厂必问:MySQL 三表 JOIN 操作的解析与性能优化,效率又如何?
- 2025-05-11 干货!SQL性能优化,书写高质量SQL语句
- 2025-05-11 Linq 下的扩展方法太少了,MoreLinq 来啦
- 2025-05-11 mysql学习3:select基础---单表查询
- 2025-05-11 Java工程师必知的SQL优化秘技(java sql优化面试题)
- 05-11产品切换数据库问题处理总结(切换数据库的命令是什么)
- 05-11真正让你明白Hive参数调优系列1:控制map个数与性能调优参数
- 05-11拉链表(拉链表取数)
- 05-11常见的数据库类型有哪些 & SQL介绍
- 05-11每日SQL自学知识点(第八天)—多表查询详解
- 05-11大厂必问:MySQL 三表 JOIN 操作的解析与性能优化,效率又如何?
- 05-11数据库(数据库有哪些)
- 05-11干货!SQL性能优化,书写高质量SQL语句
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)