【问题标题】:My Mysql select query runs slower each time it is run我的 Mysql 选择查询每次运行时运行速度较慢
【发布时间】:2019-11-06 03:38:28
【问题描述】:

我有 2 张桌子,Peoplepostcodelatlng
我有大约 2,300 条记录,其中包括他们的邮政编码,以及两个用于纬度和经度坐标的空列。

postcodelatlng 是一个包含大约 160 万行的表格,其中包含英国的每个邮政编码及其各自的坐标。

我正在尝试通过匹配邮政编码来填写人员表中的坐标。当不为每个人使用大约 0.15 秒的限制时,这可以正常工作。不幸的是,一旦我设置了限制,每次运行查询时,执行时间几乎翻了一番。

SELECT people.ID, people.Postcode, postcodelatlng.latitude, postcodelatlng.longitude 
FROM people 
INNER JOIN postcodelatlng 
ON people.Postcode=postcodelatlng.postcode 
LIMIT 30

【问题讨论】:

  • 包括您的表结构,以及定义的键和索引(+ 一些示例数据),可能会有所帮助。
  • 在我很久以前使用 MySQL 的经验中,此类问题是 100% 的内存碎片设置导致缓冲区设置过大。我可能完全错了。但如果您发布“显示变量”和“显示统计信息”的输出可能会有所帮助。
  • 你想用 LIMIT 做什么,因为没有 ORDER BY,它可能是完全随机的。

标签: mysql database optimization


【解决方案1】:

我建议添加两个索引,因为每行 0.15 秒似乎是一个很高的数字。每个邮政编码字段一个:

CREATE INDEX ppl_postcode ON people(Postcode) using HASH;
CREATE INDEX postcode_ll ON postcodelatlng(postcode) using HASH;

它现在应该运行得更快了。

【讨论】:

  • 您可能还想在 mySQL 中检查 EXPLAINSee the docs
  • 你是救生员。我已经坚持了这么久!
  • @JacobRiches 记住规则,JOIN = 的每一边都需要一个索引来提高性能。我喜欢 Boppy 使用 HASH 作为索引。
  • 哈希? MySQL 中没有这样的东西(ENGINE=MEMORY 除外)。无论如何,BTree 是一个很好的替代品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多