SQL优化 约定不等于承诺〃 2021-11-04 22:20 387阅读 0赞 **数据库优化的层次** * SQL与索引 * 存储引擎与表结构 * 数据库架构/缓存 * MySQL/Oracle配置 * 硬件与操作系统 **引起全表扫描和低效率的SQL** 1、**select id from t where id** **is null**;/**select id from t where id** **is not null**; 分析:where子句进行null值判断,导致引擎放弃使用索引而进行全表扫描 2、**select id from t where num** **!=** **100**;/**select id from t where num** **<>** **100**; 分析:where子句中使用了!或者<>操作符,导致引擎放弃索引而进行全表扫描 优化:select id from t where num>100 or num<100;(num字段上有索引) 3、**select id from t where id='1'****or** **name='admin'**; 分析:where子句中使用or来连接条件,如果其中一个字段没有索引,将会导致引擎放弃使用索引而进行全表扫描。可以使用union或union all代替 优化:select id from t where id='1' union all select id from t where name='admin' 4、**select id from t where name like** '**%abc%**'; 分析:左模糊匹配将会导致全表扫描,而右模糊匹配则不会 5、**select id from t where** **substring(name,1,3)** **= 'abc'**;/**select id from t where** **datediff(day,createdate,'2005-11-30') = 0**; 分析:where子句中对字段进行函数操作将导致引擎放弃使用索引而进行全表扫描,尽量避免在“=”左边使用函数 优化:select id from t where name like 'abc%';/select id from t where createdate>='2005-11-30' and createdate <'2005-12-1' 6、**select count(\*) from t**; 分析:不带任何条件的count函数会引起全表扫描,并且没有任何业务意义,一定杜绝 优化:select count(id) from t; 7、**select id, name from a where id** **in (select useid from b)**; 分析:in查询效率很低,因为需要对子查询的表进行全表搜索,这时可以考虑使用外连接或exists 优化:select id, name from a where exists (select userid from b where b.userid=a.id) 8、**select id from t where** **num/2** **= 100**; 分析:where子句中对字段使用表达式操作将会导致引擎放弃使用索引而全表扫描 优化 select id from t where num = 200; **建议优化:** **1、对于查询的优化,尽量避免全表扫描,应首先考虑在where及order by涉及的列上建立索引; 2、对于多张大数据量的表进行join, 尽量先分页后join;join时根据业务需求,能使用inner join尽量不使用left join 3、尽量使用varchar/nvarchar代替char/nchar 4、查询时,尽量不要使用“\*”,尽可能的使用具体的字段,数据库解析“\*”是比较耗时耗力的 5、尽量避免多表连接,不必要的连接一定要去掉 6、尽量避免在值存在大量重复的列上建立索引(比如“性别”列),这样的索引对查询的效率有多大的提高 7、对于连续数值,尽量用between and 代替 in;** **数据库SQL执行顺序(执行顺序从1-11)** (8) **select ** (9) ** distinct 需要查询出来的字段列表(如:\*)** (1) ** from tableA a** (3) **left/inner/right join tableB b** (2) ** ****on a.XX = b.YY** (4) **where 条件(如:id='123')** (5) **group by 需要分组的字段列表(如:name,type)** (6) **with CR (as) 子查询部分** (7) **having 条件** (10) **order by 需要排序的字段列表** (11) **limit 需要查询的行数条件(如:num<20)** *注:本文是作者参考一些博客和文档,结合自己实际的经验写作的,若有侵权,请联系作者。 由于作者水平有限,写作之中若有纰漏,还望指出。欢迎交流*
相关 SQL优化(三):SQL优化实战 前两节基本是讲了SQL优化重要的工具大概思路,你连explain都看不明白,遇到慢查询一个SQL执行半天的情况,估计优化起来肯定无处着手。 这节主要是SQL优化的具体实战,常 小灰灰/ 2022年10月19日 04:18/ 0 赞/ 247 阅读
相关 【sql】sql优化 1. 要尽量避免 NULL 要尽可能地把字段定义为 NOT NULL。即使应用程序无须保存 NULL(没有值),也有许多表包含了可空列(Nullable Col ゝ一纸荒年。/ 2022年06月14日 20:48/ 0 赞/ 307 阅读
相关 SQL优化 网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 这篇文章我花费了大量的时间查找资料、修 男娘i/ 2021年11月09日 21:52/ 0 赞/ 390 阅读
相关 SQL优化 数据库优化的层次 SQL与索引 存储引擎与表结构 数据库架构/缓存 MySQL/Oracle配置 硬件与操作系统 引起全表扫描和低效率的SQL 约定不等于承诺〃/ 2021年11月04日 22:20/ 0 赞/ 388 阅读
相关 sql优化 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判 蔚落/ 2021年09月28日 00:58/ 0 赞/ 406 阅读
相关 SQL优化 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断 落日映苍穹つ/ 2021年09月21日 01:26/ 0 赞/ 436 阅读
相关 sql优化 记录一下看到的适用于mysql语句的优化 1、查询 SQL 尽量不要使用 select \,而是 select 具体字段 反例子: select from e 曾经终败给现在/ 2021年09月01日 08:59/ 0 赞/ 453 阅读
相关 sql优化 1、all: 全表扫描,遍历全表找到匹配的行 index:索引全扫描,遍历整个索引来查询匹配的行 range:索引范围扫描,常见于<,>,>=,between等操作符 ... 系统管理员/ 2021年03月30日 16:03/ 0 赞/ 650 阅读
相关 sql优化 文章连接 [https://blog.csdn.net/jie\_liang/article/details/77340905][https_blog.csdn.net_... 朱雀/ 2021年01月24日 18:01/ 0 赞/ 685 阅读
还没有评论,来说两句吧...