MySQL优化(8):SELECT 之 IS NULL 优化
MySQL 对 col_name IS NULL
执行了优化。如果 WHERE 子句包含声明为 NOT NULL
的列的 col_name IS NULL
条件,则该表达式将被优化掉。
MySQL 对 col_name IS NULL
执行了优化。如果 WHERE 子句包含声明为 NOT NULL
的列的 col_name IS NULL
条件,则该表达式将被优化掉。
从 MySQL 8.0.18 开始,MySQL 对每个连接(join)具有等连接条件的任何查询使用哈希连接(Hash Join)。哈希连接通常比以前版本的 MySQL 中使用的块嵌套循环算法更快。
索引合并访问方法检索具有多个范围扫描的行并将它们的结果合并为一个。
此访问方法仅合并来自单个表的索引扫描,而不是跨多个表的扫描。 合并可以产生其底层扫描的联合、交集或交集。
在项目中需要做个报表统计,需要做多表联查,同一个 SQL 语句 Where 字段相同,但条件值不同,索引使用情况仅然不同,还存在索引失效的情况,使用强制索引与是否一起使用分页对查询效率的影响还存在关联影响。
于是做了如下分析。
MySQL优化篇系列介绍 MySQL 性能的优化并提供示例。优化涉及在多个级别上配置、调优和测量性能。
根据个人所在的工作角色(开发人员、DBA 或两者的组合),可以在单个 SQL 语句、整个应用程序、单个数据库服务器或多个联网数据库服务器的级别进行优化。
有时,可以主动并提前计划性能,而有时可能会在出现问题后对配置或代码问题进行故障排除。
优化 CPU 和内存使用还可以提高可扩展性,允许数据库处理更多负载而不会减慢速度。
数据库的性能取决于许多因素,主要是查询,schema,配置项,硬件。
使用索引来提高查询性能效果是显著的,但不正确的 SQL 语句使用也会导致索引失效,索引使用未达预期,甚至执行全表扫描,此情况是严重影响性能的,在编写 SQL 语句时特别注意。
特别强调,在每提交一条 SQL 语句时,必须使用 Explain 分析下索引的的使用。在生产环境或测试环境下,小数据的 SQL 执行感觉不到性能的差异,但一旦发布到线上大数据表,不正确的 SQL 可能会严重影响生产库的性能,并给业务带了损失,此情况仍时有发生。
给列创建索引是提高 SELECT 查询性能的最佳方式。索引类似于表行的指针,在查询时可以根据索引快速定位某些行与 WHERE 子句中的条件匹配,并检索该行的其他列值。MySQL 所有数据类型都可以创建索引。
虽然添加索引对查询带来的性能提效果是显著的,但也不是为每一个列都创建索引为好,索引还会增加 插入、更新和删除的成功,因为必须更新每个索引。
所有 MySQL列类型都可以被索引,对相关列使用索引是提高select
操作性能的最佳途径。
MySQL中最常用的存储引擎有InnoDB
和MyISAM
,这两种存储引擎的表默认创建的都是B-Tree
索引;MEMORY
存储引擎使用HASH
索引,也支持B-Tree
索引。
了解 B-tree 和 Hash 数据结构,有助于预测不同的查询在不同的存储引擎上使用这些数据结构的执行情况。特别是对于允许选择 B-tree 和 Hash 索引的内存存储引擎(MEMORY)。
InnoDB 存储引擎默认使用的是 B-tree 数据结构的索引。官方文档:B-tree 索引 与 Hash 索引比较