本节所介绍的查询优化的技巧都是和特定版本相关的,所以对于未来mysql的版本未必适用。 1 优化count查询 对于count这个函数的网上的大部分资料都是错误的或者是理解的都是一知半解的。在做优化之前我们先来看看 真正的count()函数的作用到底是什么。 count()是一个特殊的函数,有两种非常不同的作用,他可以统计某个列值的数量,也可以统计行数。 在统计列的时候,要求列值是非空的,也就是说只统计有值得列的数量。由于大多数人对NULL的理解有限, 所以并不能很深入的理解count()函数。 count的另一个作用是统计结果集的行数,最简单的方法是count(*),当我们执行这一的查询的时候,优化器会 忽略掉所有的列值而直接统计所有的行数,这样的定义更清晰性能也会更好,常见的错误是在括号内定义了一个列 却希望统计结果集的行数。 简单的优化 现有查询语句 select count(*) from world.city where id >5; 通过show status查看该查询需要扫描几千行数据,如果将条件翻转一下,先查找id<=5的数量,然后使用 总数一减就能得到同样的结果,却可以将扫描的行数减少到5行以内。 select (select count(*) from world.city) - count(*) from world.city where id <=5; 这样可以大大减少需要扫描的行数,是因为在查询优化阶段会将其中的子查询直接当做一个常数来处理, 可以查看其执行计划来验证。 在大多数场景中并不要求一定要使用count统计出精确数据的行数,这时候我们要充分利用近似值,避免让数据库 做更多的工作。即使迫不得已使用count计数,也要力求约束条件尽可能的简单,要删除掉distinct这样的约束来 避免文件排序。 快速、精确、实现简单 三者永远只能满足其二,必须舍弃其一。 2 优化关联查询 1 确保on或者using字句中的列上有索引。在创建索引的时候就要考虑关联的顺序。 当表A和表B用列C关联的时候,如果优化器的关联顺序是B、A的时候,那么就不需要在B表的 对应列上建立索引。没有用到的索引只会带来负担。一般来说,除非有其他理由,否则只需要在关联顺序中的第二个 表的相应列上创建索引。 2 确保任何的group by 和order by中的表达式只涉及到一个表中的一列, 3 优化limit分页 在进行分页操作的时候 我们通常会使用limit加上偏移量的办法实现,同时加上合适的order by子句, 如果索引使用的得当,通常效率都会不错。否则mysql将会做大量的文件排序操作。 一个非常常见又非常令人头疼的问题是,在偏移量非常大的时候,例如limit 10000,20 这时候mysql 需要查询 10020条记录然后只返回最后20条记录,前面10000条记录都将被抛弃,这样的代价非常高 如果所有的页面被访问的频率都相同,那么这样的查询平均需要访问半个表的数据。要优化这样的查询, 要么是在页面中限制分页的数量,要么是优化大便宜量的性能。 优化此类分页查询的一个最简单的办法就是尽可能的使用索引覆盖扫描,而不是查询所有的列。然后再 根据需要做一个关联操作再返回所需要的列。对于偏移量很大的时候,这样做的效率会提升非常大。 考虑下面的查询 select film_id,desc from film order by title limit 500,5; 如果这张表非常大,那么最好修改一下 select film_id ,desc from film inner join(select film_id from film order by title limit 500,5) as lim using(film_id); 这里的延迟关联将大大提升查询效率,他让mysql扫描尽可能少的页面,获取需要访问的记录后再根据关联 列回原表查询需要的所有列。这个技术也可以用于优化关联查询中的limit子句。 也可以将limit查询转换为已知位置的查询,让mysql通过范围扫描获得到对应的结果。例如在一个位置上有索引,并且预先计算出了边界值, 上面的查询就可以改写为: select film_id,desc from film where position between 500 and 504 order by position; 当然我们还可以使用租借书签的方式来提高性能。 如果我们已经知道 需要返回的记录是主键在16029到16040之间的数据,那么下一页查询 就可以如下进行 select film_id ,desc from film where film_id < 16040 order by film_id desc limit 20; 因为我们已经使用书签记录下了最新一条数据的film_id 并且film_id主键是单调增长的,所以无论翻页到多后面其性能都是很好的。 4 优化union查询 除非确实需要服务器消除重复的行,否则就一定要使用union all ,这一点非常重要。如果缺少all关键字 mysql会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性检查。这样做的代价非常高 即使有all关键字 mysql仍然会使用临时表存储结果。
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
相关推荐
MySQL性能优化是一个涵盖广泛的主题,涉及多个层面,包括SQL语句优化、索引优化、数据库表结构优化、系统级配置优化以及服务器硬件优化。以下是对这些方面进行详细说明: 1. **SQL语句优化** - **慢查询日志**:...
MySQL优化是数据库管理中的一个重要方面,它包括但不限于配置调整、索引优化、查询优化、服务器监控等。良好的优化可以显著提升数据库的性能和响应速度,保证系统的稳定运行。 一、慢查询日志与慢查询分析 MySQL的...
在进行MySQL优化时,我们需要对数据库进行深入分析,以便找到性能瓶颈并进行相应的调整。优化可以分为三个主要部分:优化概述、查询与索引优化分析以及配置优化。 首先,在优化概述部分,了解MySQL数据库常见瓶颈是...
MySQL优化是一个涉及多个方面的综合过程,需要从查询优化、表设计优化、服务器优化等多个角度入手。通过对慢查询日志的分析、使用EXPLAIN工具以及合理设计索引来提升性能,从而让MySQL运行得更加高效。通过以上介绍...
本课程从理论到实践全面覆盖了MySQL优化的关键知识点,旨在帮助后台开发人员掌握高效的数据管理和查询技能。通过学习以上内容,开发者不仅能够解决当前遇到的问题,还能够在未来面对更复杂应用场景时具备足够的应对...
MySQL 优化是一个涵盖广泛的主题,涉及...总的来说,MySQL优化是一个持续的过程,需要不断监控、分析和调整。通过有效利用慢查询日志和 `EXPLAIN` 功能,你可以更深入地了解数据库的运行情况,从而做出有针对性的改进。
MySQL查询优化是数据库管理中的关键环节,特别是在大数据量的场景下,索引优化能显著提升查询性能。本文将深入探讨“mysql查询优化之索引优化”这一主题。 首先,了解索引的基本概念至关重要。索引是数据库为了快速...
一、MySQL优化 1. 结构优化:这涉及到数据库设计,如合理创建索引、避免全表扫描、选择合适的数据类型,以及规范化与反规范化设计等。正确地设置主键和外键,可以提高数据一致性并优化查询速度。 2. 查询优化:编写...
MySQL优化是数据库管理中的关键环节,它涉及到查询效率、存储空间和系统性能等多个方面。本文主要探讨了如何通过优化字段存储和使用索引来提升查询效率。 首先,索引对数据库性能有着显著影响。适当的索引可以大幅...
### MySQL优化技巧总结 #### 一、MySQL慢查询日志(Slow Query Log)与mysqldumpslow工具 **慢查询日志**是MySQL提供的一种非常实用的功能,它能够帮助我们记录并分析那些执行时间较长的SQL语句,进而找出性能瓶颈并...
Range Optimizer特别关注单表查询优化,通过精确计算不同类型的索引扫描代价,选择最佳的访问路径。同时,动态统计信息的收集策略有助于提高查询优化器的决策准确性,从而进一步提升查询性能。 总之,理解并掌握...
查询优化是MySQL优化中最常见也是最重要的一环。常用的一种工具是`EXPLAIN`命令,它可以显示SQL查询的执行计划。 - **语法**:`EXPLAIN SELECT * FROM tb_item;` - **结果说明** - **id**:表示SELECT查询的...
MySQL优化查询效率是数据库管理中的重要任务,尤其是在大数据量的情况下,高效的查询对于系统的性能至关重要。在没有使用索引或者索引无法有效利用时,我们可以通过数学统计学的方法来提升查询速度。 首先,我们要...
MySQL索引优化是数据库性能提升的关键技术之一,尤其在处理大量数据时,高效索引能够显著加快查询速度,降低服务器负载。本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,...
MySQL优化是数据库管理中至关重要的任务,涉及到多个层面,包括SQL语句的编写、系统配置、存储引擎选择以及数据类型优化等。以下是对这些关键点的详细解释: 首先,MySQL Server的核心组件包括连接器、分析器、优化...