【问题标题】:How do i improve this mysql query for performance我如何提高这个 mysql 查询的性能
【发布时间】:2012-04-10 08:22:10
【问题描述】:

我在大型 mysql MyISAM 表上的 php 中查询很慢:

select p.*, m.*, d.* 
from datafeeds as d, 
     products as p left outer join meta as m on p.mykey = m.mykey 
where p.datafeed_id = d.id and "keyword"

该表有 300 万条记录,在某些情况下,此搜索查询最多需要 50 秒。

如果能提供优化查询和/或表和索引的提示,我将不胜感激。

datafeed_id 有索引 BTREE mykey_index 有索引 BTREE

我尝试了 EXPLAIN EXTENDED:

解释扩展选择 p。 * ,米。 *,d。 * FROM 数据馈送 AS d,产品 AS p LEFT OUTER JOIN meta AS m ON p.mykey = m.mykey 其中 p.datafeed_id = d.id AND“关键字”

id |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外的 1 |简单 |空 |空 |空 |空 |空 |空 |空 |不可能在哪里

【问题讨论】:

  • 如果您继续从每个表中选择 *,您将不会获得任何性能提升
  • 致其他人:WHERE 中的 p & d 关系是否会导致任何放缓,或者只是当时的风格?
  • 也许你应该看看codereview.stackexchange.com
  • 你能发一个$name_clause的例子吗?
  • 还有左外连接痛到!我们可以看到表结构吗?需要知道哪些键已被索引以及您在 $name_clause 中跳过哪些键

标签: php mysql myisam


【解决方案1】:

确保 p.datafeed_idm.mykey 已编入索引。了解$name_clause 中包含的内容也将有所帮助。您可能还想查看 MySQL 的 EXPLAIN,因为它可以帮助您缩小给定 SELECT 语句中使用的索引。

http://dev.mysql.com/doc/refman/5.0/en/explain.html

发布结果以获得更好的答案。

【讨论】:

  • datafeed_id 有索引 BTREE mykey_index 有索引 BTREE。我尝试了 EXPLAIN EXTENDED - 请参阅上面的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2013-03-21
  • 1970-01-01
  • 2017-02-26
  • 2017-04-12
  • 2018-07-03
相关资源
最近更新 更多