当前位置:网站首页>SQL优化
SQL优化
2022-07-29 06:16:00 【棒棒吃不胖】
1)查询select尽量具体到某字段,而不是 select *
用 select * 可能会回表查询,增加资源开销。
2)确定查询字段(普通索引)只有一条记录时,使用limit 1
如果查询字段是唯一索引,就不用加了,因为已经确定是一条了。
3)减少where条件句中or的使用。
or 的前后字段中如果一个有索引,一个没有索引,那么很可能会全表扫描,不走索引。
因为Mysql的优化器会判断,无论如何都要全表扫描,因此放弃使用索引额外的开销。
这里是有关索引失效的文章链接。
可能导致索引失效的原因
4)like语句后的%不能放在开头,不然很可能索引失效
反面教材
select id from test where name like '%k';
百分号放在中间或字符最后,还是会走索引的。
5)尽量不在索引列的查询中使用MySQL的内置函数,否则索引可能失效
6)避免在where子句中使用数学运算式子,否则索引失效
反面教材
select name from test where id+2=10;
正确的语句是select name from test where id=8;
7)对于辅助索引的字段,不要使用下列的“不等于”号,不走索引
!=
<>
not in
但是如果字段是聚集索引,上述语句会走索引
8)联合索引中注意尽量遵循最左匹配原则,可能索引失效,也可能走索引
创建联合索引(k1,k2,k3)相当于创建了3个索引(k1) (k1,k2) (k1,k2,k3)
如果查询(k2) (k3) (k2,k3)可能不走索引
搭建测试环境
CREATE TABLE `user1`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`userId` VARCHAR(32) NOT NULL,
`age` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_userid_age`(`userId`,`age`) USING BTREE
)ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

下面是各种情况下是否走索引的执行计划分析
8-1)如果where子句后跟单独的age,一般不走索引,但也可能走索引。
下面是我的执行计划分析结果。
DESC SELECT * FROM user1 WHERE age>10;

8-2)当我们建议还是遵循最左匹配原则,因为Mysql的不同优化器也是影响索引执行的因素。
DESC SELECT * FROM user1 WHERE userId=10 AND age=10;

9)查询中where和order by子句后的字段应建立索引(联合索引)
10)使用覆盖索引提高查询效率
id是主键 name是普通索引
select id,name from test where age like '2%';
11)删除冗余和重复索引
建立联合索引(k1,k2)就相当于建立索引(k1)和(k1,k2)
如果再单独对k1字段建立索引,就会重复,会影响性能
12)当修改或删除的数据量过大,应该分批操作
反面教材
delete * from test where id<20000;
正面教材
delete * from test where id<10000;
delete * from test where id>10000 and id<20000;
一次性删除大量数据,会造成CPU利用率过高,甚至有锁等待问题,影响其他事务对行内容的查询。
13)如果可能,尽量将null换成默认值,走索引的可能性更高。
使用null走不走索引和mysql的查询成本有关,优化器会选择成本更低的方式
14)索引不是越多越好,5个以内最好。
索引的建立需要空间,维护也是有成本的。
数据量越大,索引的构建也增加了查询的资源消耗。
15)如果能用数字型字段,就不用字符型字段。
相较而言,数字型字段的查询和连接性能更高,存储开销更小。
16)注意隐式转换导致的可能的索引失效
如果是字符串类型的字段,where后的子句需用单引号括起来,进行字符类型匹配
17)养成分析SQL语句的执行计划的习惯
desc SQL语句
explain SQL语句
边栏推荐
- 模拟卷Leetcode【普通】093. 复原 IP 地址
- 基于C语言设计的学籍管理系统
- MySQL:当你CRUD时BufferPool中发生了什么?十张图就能说清楚
- Cesium反射
- Ali gave several SQL messages and asked how many tree search operations need to be performed?
- Teacher wangshuyao's operations research course notes 07 linear programming and simplex method (standard form, base, base solution, base feasible solution, feasible base)
- [C language brush leetcode] 1054. Bar code with equal distance (m)
- 做开发4年13K,想转行自动化测试,薪资还能涨吗···
- pytest合集(7)— 参数化
- Leetcode-592: fraction addition and subtraction
猜你喜欢

竣达技术 | 适用于”日月元”品牌UPS微信云监控卡

实现改变一段文字的部分颜色效果

MySQL:当你CRUD时BufferPool中发生了什么?十张图就能说清楚

Teacher wangshuyao's operations research course notes 07 linear programming and simplex method (standard form, base, base solution, base feasible solution, feasible base)

要不要满足客户所有的需求

王树尧老师运筹学课程笔记 04 线性代数基础

城市花样精~侬好!DESIGN#可视化电台即将开播

Idea cannot find a database solution

ECCV 2022 lightweight model frame Parc net press apple mobilevit code and paper Download

新同事写了几段小代码,把系统给搞崩了,被老板爆怼一顿!
随机推荐
2D cartoon rendering - advanced skills
Invalid access control
实现改变一段文字的部分颜色效果
【C语言刷LeetCode】2332. 坐上公交的最晚时间(M)
SSH免密登录-两台虚拟机建立免密通道 双向信任
王树尧老师运筹学课程笔记 07 线性规划与单纯形法(标准型、基、基解、基可行解、可行基)
外包干了3年,跳槽后转自动化测试工资是原来的2倍,秘诀原来是......
MySQL: what happens in the bufferpool when you crud? Ten pictures can make it clear
约瑟夫环问题
Flink real-time warehouse DWD layer (processing complex data - installation and replacement of streams and tables) template code
Flink实时仓库-DWD层(流量域)模板代码
pytest合集(7)— 参数化
微信小程序的反编译
Flink real-time warehouse DWD layer (transaction domain - additional purchase dimension degradation processing) template code
Connecting PHP 7.4 to Oracle configuration on Windows
IDEA中实现Mapper接口到映射文件xml的跳转
数据库使用psql及jdbc进行远程连接,不定时自动断开的解决办法
Decompilation of wechat applet
线程同步—— 生产者与消费者、龟兔赛跑、双线程打印
Dbasql interview questions