博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql优化的一些基本语法
阅读量:4499 次
发布时间:2019-06-08

本文共 1863 字,大约阅读时间需要 6 分钟。

1.慢SQL消耗了70%~90%的数据库CPU资源;

2.SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;

3.SQL语句可以有不同的写法;

下面是我总结的一些SQL常见的优化方法,每个案例都简单易懂,在开发过程中可以作为参考:

 

不使用子查询

 

例:SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');

子查询在MySQL5.5版本里,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表t2,当外表的数据很大时,查询速度会非常慢。
在MariaDB10/MySQL5.6版本里,采用join关联方式对其进行了优化,这条SQL会自动转换为
SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id;

但请注意的是:优化只针对SELECT有效,对UPDATE/DELETE子查询无效,固生产环境应避免使用子查询

 

避免函数索引

 

例:SELECT * FROM t WHERE YEAR(d) >= 2016;

由于MySQL不像Oracle那样支持函数索引,即使d字段有索引,也会直接全表扫描。
应改为----->
SELECT * FROM t WHERE d >= '2016-01-01';

 

用IN来替换OR

 

 

 

低效查询

SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;
----->
高效查询
SELECT * FROM t WHERE LOC_IN IN (10,20,30);

 

LIKE双百分号无法使用到索引

SELECT * FROM t WHERE name LIKE '%de%';

----->
SELECT * FROM t WHERE name LIKE 'de%';
目前只有MySQL5.7支持全文索引(支持中文)

 

读取适当的记录LIMIT M,N

 

 

SELECT * FROM t WHERE 1;

----->
SELECT * FROM t WHERE 1 LIMIT 10;

 

避免数据类型不一致

 

 

SELECT * FROM t WHERE id = '19';

----->
SELECT * FROM t WHERE id = 19;

 

分组统计可以禁止排序

 

 

SELECT goods_id,count(*) FROM t GROUP BY goods_id;

默认情况下,MySQL对所有GROUP BY col1,col2...的字段进行排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。
----->
SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL;

 

避免随机取记录

 

 

 

SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;

MySQL不支持函数索引,会导致全表扫描
----->
SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4; 

 

禁止不必要的ORDER BY排序

 

 

SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;

----->
SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;

 

 

 

批量INSERT插入

 

 

 

INSERT INTO t (id, name) VALUES(1,'Bea');

INSERT INTO t (id, name) VALUES(2,'Belle');
INSERT INTO t (id, name) VALUES(3,'Bernice');
----->
INSERT INTO t (id, name) VALUES(1,'Bea'), (2,'Belle'),(3,'Bernice');

 

转载于:https://www.cnblogs.com/xinboke/p/5422093.html

你可能感兴趣的文章
[笔记]C#基础入门(三)——C#的常量
查看>>
随机生成32位字符串算法
查看>>
几种常用的排序方法3--选择排序
查看>>
C#中删除字符串最后一个字符的几种方法
查看>>
远程管理控制ssh
查看>>
Django框架之ORM(数据库)操作
查看>>
解决:Cannot find ContentTypeReader HeightmapCollision.HeightMapInfoReader
查看>>
内存映射(Linux设备驱动程序)
查看>>
bzoj 5072
查看>>
[Luogu] 矩阵加速(数列)
查看>>
[LeetCode] Design Circular Queue 设计环形队列
查看>>
运动回调-链式运动
查看>>
素数---小修改1
查看>>
linux shell常用快捷键(转载)
查看>>
Ajax 跨域请求
查看>>
spring test---測试SpringMvc初识
查看>>
信息加密之消息摘要算法的MAC
查看>>
Docker 组件如何协作?- 每天5分钟玩转容器技术(8)
查看>>
js时间日期处理
查看>>
161117、使用spring声明式事务抛出 identifier of an instance of
查看>>