MySQL - 我怎么知道我的查询被调整了?

时间:2015-06-22 08:18:30

标签: mysql performance explain

我正在从头开始创建一个数据库,我正在尝试创建具有性能的查询。出于测试目的,我在表格中填写了测试数据。

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

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

enter image description here 从解释中我注意到查询正在使用我为它创建的所有索引,所以我应该很高兴它应该很快,但它需要3秒(当我在MySQL重启后执行它),并且实时申请这太过分了。

基本上我有两个问题:

  1. 有没有办法“matematically”检测查询是否表现最佳。即检查扫描的行数
  2. 如何测试查询速度?我尝试使用“select sql_no_cache ...”或“FLUSH QUERY CACHE”;或“重置QUERY CACHE;”查询之间,但结果始终是第一次后查询似乎更快。我注意到我的查询只需要在MySQL重新启动后第一次使用很长时间(比方说3秒),而且如果我更改某些参数(我不重启MySQL)会更快(比如说0.6秒)。
  3. 非常感谢你的帮助

1 个答案:

答案 0 :(得分:2)

除了琐碎的查询外,无法知道您是否拥有最佳查询&索引。您也无法获得有关架构和应用程序设计的指标。

对于3路JOIN且“行”为409,45,1的冷系统,

3秒也不算太差。在温暖的系统上0.3秒可以正常吗?大部分时间系统都不会运行温暖吗?

“查询缓存”有一个目的,但它对大多数生产系统没有用。它记住每个SELECT的输出;然后,如果相同的查询在表之前出现,那么表将会非常快速地(~1ms)返回保存的结果集。在典型的生产系统中,表格经常变化,以使其有用。

关闭QC(_size = 0和_type = OFF),或在计时查询时使用SELECT SQL_NO_CACHE...

“使用索引”很好,但它没有任何证据。如果您想讨论该特定查询,请提供SHOW CREATE TABLESELECT。我们可以能够建议更好的数据类型,更好的索引,模式的重新排列,SELECT的重新设计,甚至是应用程序的重新设计。

我看到“geo” - 如果你使用纬度和经度,那么有一个非平凡的,非显而易见的,但更快的方法来“找到最近的”,但它涉及我提到的所有内容上一段。

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

  • 每个Rows的{​​{1}}多个EXPLAIN列(409 * 45 * 1);看哪个产品较小。
  • SELECT;查看哪个FLUSH STATUS; SELECT ...; SHOW SESSION STATUS LIKE 'Handler%';的值较小。