MySQL - 我如何知道我的查询已调整?

MySQL - How can I know my query is tuned?

我正在从头开始创建数据库,并且我正在尝试创建考虑性能的查询。出于测试目的,我用测试数据填充了表格。

我的查询需要连接 3 个表:2 个有数百万行,第三个有数十万行。

我怎么知道我的查询是最快的? 这里解释的结果:

从解释中我注意到查询正在使用我为它创建的所有索引,所以我应该很高兴并且它应该很快,但是它需要 3 秒(当我在 MySQL 重启后执行它时),并且对于实时应用程序,这太多了。

基本上我有两个问题:

  1. 有没有办法 "matematically" 检测查询是否性能最佳。即检查扫描的行数
  2. 如何测试查询速度?我尝试在查询之间使用 "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 TABLESELECT。我们可能 能够建议更好的数据类型、更好的索引、架构的重新排列、SELECT 的重新制定,甚至重新设计您的应用程序。

我明白了 "geo"——如果你使用纬度和经度,那么有一个不平凡、不明显但更快的方法 "find the nearest",但它只涉及我在上一段中提到的所有内容。

回到你的数学问题——如果你正在比较两个SELECTs,这里有两种不精确的比较方法他们的表现:

  • EXPLAIN 中的 Rows 列 (409*45*1) 乘以每个 SELECT;看哪个产品小
  • FLUSH STATUS; SELECT ...; SHOW SESSION STATUS LIKE 'Handler%';;查看哪个 SELECT 具有较小的值。