MySQL - 我如何知道我的查询已调整?
MySQL - How can I know my query is tuned?
我正在从头开始创建数据库,并且我正在尝试创建考虑性能的查询。出于测试目的,我用测试数据填充了表格。
我的查询需要连接 3 个表:2 个有数百万行,第三个有数十万行。
我怎么知道我的查询是最快的?
这里解释的结果:
从解释中我注意到查询正在使用我为它创建的所有索引,所以我应该很高兴并且它应该很快,但是它需要 3 秒(当我在 MySQL 重启后执行它时),并且对于实时应用程序,这太多了。
基本上我有两个问题:
- 有没有办法 "matematically" 检测查询是否性能最佳。即检查扫描的行数
- 如何测试查询速度?我尝试在查询之间使用 "select sql_no_cache ..." 或 "FLUSH QUERY CACHE;" 或 "RESET QUERY CACHE;",但结果始终是第一次后查询似乎更快。我注意到我的查询只在 MySQL 重启后第一次花费很长时间(比如 3 秒),这比我更改某些参数(并且我不重启 MySQL)更快(比方说 0.6 秒)。
非常感谢您的帮助
除了琐碎的查询,没有办法知道您是否有最佳的查询和索引。您也无法获得架构和应用程序设计的好坏程度的指标。
3 路 JOIN
在冷系统上 3 秒,"Rows" 为 409、45、1 还不错。在温暖的系统上 0.3 秒可以吗?系统大多数时候不会 运行 热吗?
"Query Cache" 有一个用途,但它对 大多数 生产系统没有用处。它会记住每个 SELECT 的输出;那么如果 相同 查询出现 before that table(s) 变化,它将非常迅速(~1ms)return 保存的结果集。在一个典型的生产系统中,table(s) 变化太频繁以至于没有用。
要么关闭 QC(_size=0 和 _type=OFF),要么在计时查询时使用 SELECT SQL_NO_CACHE...
。
"Using index"很好,但不能证明什么。如果您想讨论该特定查询,请提供 SHOW CREATE TABLE
和 SELECT
。我们可能 能够建议更好的数据类型、更好的索引、架构的重新排列、SELECT
的重新制定,甚至重新设计您的应用程序。
我明白了 "geo"——如果你使用纬度和经度,那么有一个不平凡、不明显但更快的方法 "find the nearest",但它只涉及我在上一段中提到的所有内容。
回到你的数学问题——如果你正在比较两个SELECTs
,这里有两种不精确的比较方法他们的表现:
- 将
EXPLAIN
中的 Rows
列 (409*45*1) 乘以每个 SELECT
;看哪个产品小
FLUSH STATUS; SELECT ...; SHOW SESSION STATUS LIKE 'Handler%';
;查看哪个 SELECT
具有较小的值。
我正在从头开始创建数据库,并且我正在尝试创建考虑性能的查询。出于测试目的,我用测试数据填充了表格。
我的查询需要连接 3 个表:2 个有数百万行,第三个有数十万行。
我怎么知道我的查询是最快的? 这里解释的结果:
基本上我有两个问题:
- 有没有办法 "matematically" 检测查询是否性能最佳。即检查扫描的行数
- 如何测试查询速度?我尝试在查询之间使用 "select sql_no_cache ..." 或 "FLUSH QUERY CACHE;" 或 "RESET QUERY CACHE;",但结果始终是第一次后查询似乎更快。我注意到我的查询只在 MySQL 重启后第一次花费很长时间(比如 3 秒),这比我更改某些参数(并且我不重启 MySQL)更快(比方说 0.6 秒)。
非常感谢您的帮助
除了琐碎的查询,没有办法知道您是否有最佳的查询和索引。您也无法获得架构和应用程序设计的好坏程度的指标。
3 路 JOIN
在冷系统上 3 秒,"Rows" 为 409、45、1 还不错。在温暖的系统上 0.3 秒可以吗?系统大多数时候不会 运行 热吗?
"Query Cache" 有一个用途,但它对 大多数 生产系统没有用处。它会记住每个 SELECT 的输出;那么如果 相同 查询出现 before that table(s) 变化,它将非常迅速(~1ms)return 保存的结果集。在一个典型的生产系统中,table(s) 变化太频繁以至于没有用。
要么关闭 QC(_size=0 和 _type=OFF),要么在计时查询时使用 SELECT SQL_NO_CACHE...
。
"Using index"很好,但不能证明什么。如果您想讨论该特定查询,请提供 SHOW CREATE TABLE
和 SELECT
。我们可能 能够建议更好的数据类型、更好的索引、架构的重新排列、SELECT
的重新制定,甚至重新设计您的应用程序。
我明白了 "geo"——如果你使用纬度和经度,那么有一个不平凡、不明显但更快的方法 "find the nearest",但它只涉及我在上一段中提到的所有内容。
回到你的数学问题——如果你正在比较两个SELECTs
,这里有两种不精确的比较方法他们的表现:
- 将
EXPLAIN
中的Rows
列 (409*45*1) 乘以每个SELECT
;看哪个产品小 FLUSH STATUS; SELECT ...; SHOW SESSION STATUS LIKE 'Handler%';
;查看哪个SELECT
具有较小的值。