我正在从头开始创建一个数据库,我正在尝试创建具有性能的查询。出于测试目的,我在表格中填写了测试数据。
我的查询需要连接3个表:2个包含数百万行,第3个包含数十万个行。
我怎么知道我的查询是最快的? 这里解释的结果是:
从解释中我注意到查询正在使用我为它创建的所有索引,所以我应该很高兴它应该很快,但它需要3秒(当我在MySQL重启后执行它),并且实时申请这太过分了。
基本上我有两个问题:
非常感谢你的帮助
答案 0 :(得分:2)
除了琐碎的查询外,无法知道您是否拥有最佳查询&索引。您也无法获得有关架构和应用程序设计的指标。
对于3路JOIN
且“行”为409,45,1的冷系统,3秒也不算太差。在温暖的系统上0.3秒可以正常吗?大部分时间系统都不会运行温暖吗?
“查询缓存”有一个目的,但它对大多数生产系统没有用。它记住每个SELECT的输出;然后,如果相同的查询在表之前出现,那么表将会非常快速地(~1ms)返回保存的结果集。在典型的生产系统中,表格经常变化,以使其有用。
关闭QC(_size = 0和_type = OFF),或在计时查询时使用SELECT SQL_NO_CACHE...
。
“使用索引”很好,但它没有任何证据。如果您想讨论该特定查询,请提供SHOW CREATE TABLE
和SELECT
。我们可以能够建议更好的数据类型,更好的索引,模式的重新排列,SELECT
的重新设计,甚至是应用程序的重新设计。
我看到“geo” - 如果你使用纬度和经度,那么有一个非平凡的,非显而易见的,但更快的方法来“找到最近的”,但它涉及我提到的所有内容上一段。
回到你的数学问题 - 如果你正在比较两个 SELECTs
,这里有两种不精确的方法来比较它们的表现:
Rows
的{{1}}多个EXPLAIN
列(409 * 45 * 1);看哪个产品较小。SELECT
;查看哪个FLUSH STATUS; SELECT ...; SHOW SESSION STATUS LIKE 'Handler%';
的值较小。