首页 > 数据库 >SQL 语句优化建议

SQL 语句优化建议

时间:2024-06-04 22:44:05浏览次数:20  
标签:语句 join name 使用 查询 索引 全表 SQL 优化

    1. 避免在索引列上使用表达式或隐式类型转换。
    2. 尽量避免在where条件中使用NOT、<>、!= 等操作符,因为这些可能会导致引擎放弃使用索引而使用全表扫描。
    3. or的两个条件都有索引的话,用union或union all代替or。
    4. 条件列没有索引情况下,用in操作符替换or,在mysql中or的效率为O(n),而in的效率为O(log2n)。
    5. 若条件范围内是连续的数值,建议使用between操作符替换in。
    6. 子查询结果集较大时,适合用EXISTS(EXIST先查询主表,再查询从表)子查询结果集较小时,适合用IN(IN先查询从表,再查询主表)。
    7. 不建议使用%前缀模糊查询(例如%a% 、 %a), 因为会导致引擎放弃使用索引而进行全表扫描; 如果需要用%a%模糊查询,可采用全文索引方式解决。
    ALTER TABLE `dynamic_201606` ADD FULLTEXT INDEX `idx_user_name` (`user_name`)。
    1. 若索引列已经设置了不能为NULL,则使用IsNull、Is Not NULL毫无意义,会导致索引失效,走全表扫描。
    2. 若结果集没有重复数据或者允许出现重复数据,则使用UNION ALL替换UNION,union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。
    3. Sql语句不应该过于冗长,合理利用临时表。
    4. 对于联合索引来说,要遵守最左前缀法则,举列来说索引含有字段id,name,school,可以直接用id字段,也可以id,name这样的顺序,但是name,school都无法使用这个索引。所以在创建联合索引的时候一定要注意索引字段顺序,常用的查询字段放在最前面。
    5. 尽量使用inner join,避免left join,如果连接方式是inner join,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表,但是left join在驱动表的选择上遵循的是左边驱动右边的原则,即left join左边的表名为驱动表。
    6. 语句中避免使用*符号,用具体字段代替*。原因:浪费流量;全表扫描,读硬盘,IO次数增多,索引失效。
    7. 批量插入时,建议一次性插入,而不是一条条插入,但批量操作需要把握一个度,建议每批数据尽量控制在500以内。如果数据多于500,则分多批次处理。
    8. 使用Join操作多个表时,应确保操作表的数量不宜过多,最多不超过3个表。如果join太多,MySQL在选择索引的时候会非常复杂,很容易选错索引。
    9. In中的值不宜过多。最好不要超过500个,若大于500,建议分批查询然后汇总。
    10. 选择合适的字段类型,例如
    11. 能用数字类型,就不用字符串,因为字符的处理往往比数字要慢。
    12. 尽可能使用小的类型,比如:用bit存布尔值,用tinyint存枚举值等。
    13. 长度固定的字符串字段,用char类型。
    14. 长度可变的字符串字段,用varchar类型。
    15. 金额字段用decimal,避免精度丢失问题。
    16. 控制索引数量,索引数量最好不要超过5个。
    17. 表数据量较大时,使用连接查询代替子查询。因为执行子查询时,需要创建临时表,查询完毕后,需要再删除这些临时表,有一些额外的性能消耗。

标签:语句,join,name,使用,查询,索引,全表,SQL,优化
From: https://www.cnblogs.com/mingcore/p/18231941

相关文章

  • MySQL 关键特性一:插入缓冲、双写缓冲
    前言​本文主要介绍mysql的几大特性之几,如:双写缓冲和插入缓存。双写缓冲基本概念​双写缓冲(doublewritebuffer)是MySQL/InnoDB中用于支持原子页面更新的一种机制。在传统的数据库系统中,为了保证数据的一致性和可恢复性,通常需要进行冗余写入操作。这种冗余写入通过在......
  • Tomcat部署及优化
    目录一.Tomcat概述1.介绍2.使用场景3.组件构成4.组件结构5.请求过程二.Tomcat部署1.关闭防火墙2.下载安装JDK3.安装启动tomcat4.部署虚拟主机4.1.创建xy101和xy102项目目录和文件4.2.修改Tomcat主配置文件server.xml一.Tomcat概述1.介绍2.使用场景作......
  • kettle从入门到精通 第六十五课 ETL之kettle 执行动态SQL语句,轻松实现全量&增量数据同
    本次课程的逻辑是同步t1表数据到t2表,t1和t2表的表机构相同,都有id,name,createtime三个字段。 CREATETABLE`t1`(`id`bigintNOTNULLAUTO_INCREMENT,`name`varchar(10)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULL,`createtime`datetime......
  • MySQL InnoDB Cluster如何定位或找出超过事务大小的SQL?
    在MySQLInnoDBCluster中,有一个系统变量/参数group_replication_transaction_size_limit控制着事务的大小,如下所示mysql> select @@global.group_replication_transaction_size_limit;+---------------------------------------------------+| @@global.group_replication_tr......
  • 神经网络与深度学习——第7章 网络优化与正则化
    本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/第7章网络优化与正则化网络优化与正则化网络优化网络结构多样性高维变量的非凸优化神经网络优化的改善方法优化算法小批量梯度下降批量大小选择学习率调整学习率衰减学习......
  • 无人机航迹规划:人工原生动物优化算法APO求解无人机路径规划MATLAB
    一、无人机模型介绍单个无人机三维路径规划问题及其建模_无人机路径规划场景建模-CSDN博客参考文献:[1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120二、人工原生动物优化算法APO求解无人机路径规划人工原生动物......
  • 使用Python连接到MySQL数据库并执行查询
    在当今数字化时代,数据是企业和组织中至关重要的资产之一。数据库是存储和管理数据的核心工具之一,而MySQL则是其中一种流行的关系型数据库管理系统。如何使用Python编程语言连接到MySQL数据库,并执行查询以检索所需的数据。首先,需要安装pymysql库:pipinstallpymysql下......
  • SQL入门全攻略(二)
    一、引言在上一篇文章中,我们初步了解了SQL的基础知识和概念。今天,我们将深入探讨SQL的增删查改操作,并学习一些高级用法,让你的SQL技能更上一层楼。二、SQL基础增删查改操作1.增加使用INSERTINTO语句向表中插入新记录。INSERTINTO表名(列1,列2,列3,...)VALUES(......
  • 蛇鹫优化算法(Secretary bird optimization algorithm,SBOA)的复杂城市地形下无人机避障
    一、部分代码蛇鹫优化算法(Secretarybirdoptimizationalgorithm,SBOA)由FuYoufa等人于2024年提出,该算法的灵感来自于蛇鹫在自然环境中的生存行为。参考文献:[1]FuY,LiuD,ChenJ,etal.Secretarybirdoptimizationalgorithm:anewmetaheuristicforsolvinggloba......
  • 【MySQL】表左连接操作,对右表添加过滤数据的条件时,容易忽略的坑(左关联统计右表数据不
     疑问:sql中,左关联,右边表中无对应的数据,那能对右边的列进行筛选吗 ?带着疑问,我们看一下下面的文章MySQL】表左连接,对右表过滤数据时的坑左关联统计右边数据sqlSELECTma.id,ma.model_id,ma.event_rules_id,ma.model_applicati......