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

标签 mysql performance explain

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

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

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

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

基本上我有两个问题:

  1. 有没有一种方法可以“自动”检测查询是否性能最佳。即检查扫描的行数
  2. 如何测试查询速度?我尝试使用“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 TABLESELECT。我们可能能够建议更好的数据类型、更好的索引、架构的重新排列、SELECT 的重新表述,甚至重新设计您的应用程序。

我看到“geo”——如果你使用纬度和经度,那么有一个不平凡、不明显但更快的方法来“找到最近的”,但它涉及我在上一段。

回到您的数学问题 -- 如果您正在比较两个 SELECT,这里有两种不精确的方法来比较它们的性能:

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

关于MySQL - 我如何知道我的查询已调整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30975051/

相关文章:

php - 用字符串中的单词创建链接

jquery - 删除下拉选项性能问题

iphone - 在编译时识别 iDevices,最佳实践

java - 为什么改变初始化 RandomAccessFile 对象的方式会改变 FileChannel 性能?

MySQL如何创建正确的索引

php - 如果数据存在,防止将数据插入数据库

python - 有没有像 Python 的 micro ORM 这样的 Dapper?

mysql - 由其他表的主键组成的复合主键

MongoDb geoIntersects 不使用 IndexOnly

Mysql查询优化