我正在从头开始创建一个数据库,并尝试在创建查询时考虑到性能。出于测试目的,我用测试数据填充了表格。
我的查询需要连接 3 个表:2 个表有数百万行,第三个表有数十万行。
我怎么知道我的查询是最快的? 这是解释的结果:
从解释中我注意到查询正在使用我为它创建的所有索引,所以我应该很高兴并且它应该很快,但是它需要 3 秒(当我在 MySQL 重启后执行它时),并且是实时的这太过分了。
基本上我有两个问题:
- 有没有一种方法可以“自动”检测查询是否性能最佳。即检查扫描的行数
- 如何测试查询速度?我尝试使用“select sql_no_cache ...”或“FLUSH QUERY CACHE;”或“重置查询缓存;”在查询之间,但结果总是在第一次之后查询似乎更快。我注意到我的查询只在 MySQL 重启后第一次花费很长时间(比如 3 秒),如果我更改一些参数(并且我不重启 MySQL)则更快(比如 0.6 秒)。
非常感谢您的帮助
最佳答案
除了琐碎的查询,没有办法知道您是否有最佳的查询和索引。您也无法衡量架构和应用程序的设计有多好。
对于“行”为 409、45、1 的 3 向 JOIN
,在冷系统上 3 秒还算不错。在温暖的系统上 0.3 秒可以吗?系统不会大部分时间都处于热运行状态吗?
“查询缓存”只有一个用途,但它对大多数 生产系统没有用处。它会记住每个 SELECT 的输出;然后,如果相同查询在表更改之前出现,它将非常快速地(~1ms)返回保存的结果集。在典型的生产系统中,表变化太过频繁以至于没有用。
要么关闭 QC(_size=0 和 _type=OFF),要么在计时查询时使用 SELECT SQL_NO_CACHE...
。
“用索引”说的好,但不能证明什么。如果您想讨论该特定查询,请提供 SHOW CREATE TABLE
和 SELECT
。我们可能能够建议更好的数据类型、更好的索引、架构的重新排列、SELECT
的重新表述,甚至重新设计您的应用程序。
我看到“geo”——如果你使用纬度和经度,那么有一个不平凡、不明显但更快的方法来“找到最近的”,但它涉及我在上一段。
回到您的数学问题 -- 如果您正在比较两个 SELECT
,这里有两种不精确的方法来比较它们的性能:
- 在
EXPLAIN
中为每个SELECT
增加Rows
列 (409*45*1);看看哪个有较小的产品。 FLUSH 状态;选择 ...; SHOW SESSION STATUS LIKE 'Handler%';
;查看哪个SELECT
具有较小的值。
关于MySQL - 我如何知道我的查询已调整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30975051/