【问题标题】:Mysql self inner join query?Mysql自内连接查询?
【发布时间】:2012-10-23 12:00:14
【问题描述】:

当我在 mysql 中运行以下查询时,需要 78 秒才能显示记录。还有其他方法可以编写此查询。这是我的 mysql查询->"

select distinct nuqta1.post_id from wp_postmeta as nuqta1 
inner join wp_postmeta as nuqta2 on (nuqta1.post_id = nuqta2.post_id) 
inner join wp_postmeta as nuqta4 on (nuqta1.post_id = nuqta4.post_id) 
inner join wp_postmeta as nuqta5 on (nuqta1.post_id = nuqta5.post_id) 
inner join wp_postmeta as nuqta6 on (nuqta1.post_id = nuqta6.post_id) 
inner join wp_postmeta as nuqta7 on (nuqta1.post_id = nuqta7.post_id) 
inner join wp_postmeta as nuqta8 on (nuqta1.post_id = nuqta8.post_id) 
inner join wp_postmeta as nuqta9 on (nuqta1.post_id = nuqta9.post_id) 
inner join wp_postmeta as nuqta10 on (nuqta1.post_id = nuqta10.post_id) 
inner join wp_postmeta as nuqta11 on (nuqta1.post_id = nuqta11.post_id) 
inner join wp_postmeta as nuqta12 on (nuqta1.post_id = nuqta12.post_id) 
where (nuqta2.meta_key = 'checkin' and nuqta2.meta_value LIKE '%10/31/2012%') 
and (nuqta4.meta_key = 'guests' and nuqta4.meta_value ='1') 
and (nuqta5.meta_key = 'roomtype' and nuqta5.meta_value LIKE '%Entire home/apt%') 
and (nuqta6.meta_key = 'price' and cast(nuqta6.meta_value as signed) BETWEEN '10' and '99999') 
and (nuqta7.meta_key = 'amenities' and nuqta7.meta_value LIKE '%Wireless Internet%') 
and (nuqta8.meta_key = 'amenities' and nuqta8.meta_value LIKE '%TV%') 
and (nuqta9.meta_key = 'amenities' and nuqta9.meta_value LIKE '%Kitchen%') 
and (nuqta10.meta_key = 'amenities' and nuqta10.meta_value LIKE '%Wireless Internet%') 
and (nuqta11.meta_key = 'amenities' and nuqta11.meta_value LIKE '%TV%') 
and (nuqta12.meta_key = 'amenities' and nuqta12.meta_value LIKE '%Kitchen%') 
and 1=1 order by nuqta1.post_id asc

”。 而且我正在使用 wordpress 表 wp_postmeta 来运行这个查询

【问题讨论】:

  • 从 join 子句和 where 子句中删除不必要的括号。如果不需要,也可以区分。
  • 感谢您显示查询。如果您告诉我们您要做什么,可能会有所帮助。
  • 呃。花了这么长时间并不奇怪。但是您没有提供表结构和执行计划的详细信息。但是,要正确解决此问题,您需要彻底检查您的 DBMS 架构 - msot 明智的方法是正确规范化它。话虽如此,使用 HandlerSocket API 会快很多
  • @lucia nie 我试试看。我从 join 子句中删除了 distinct 和括号,但它没有用。
  • 我正在尝试从 wp_postmeta 表中获取 post_id,其中我的 meta_key = "guests" 和 meta_value = "1" 以及我的 meta_key = 'price' 和 meta_value = '300' 。我正在使用 wordpress 表 postmeta 进行搜索。

标签: mysql performance database-performance


【解决方案1】:

这个查询中有很多LIKE '%whatever%' 子句。这些子句中的每一个都必然导致对 wp_postmeta 进行全表扫描。你在不到十秒的时间内完成它们实际上非常好。

如果您对 meta_value 列的值有更多了解,那么您可以使用 LIKE 'whatever%'(去掉前面的 % 通配符),您会加快速度。

也不清楚为什么你有 nuqta10、nuqta11、nuqta12。那些似乎搜索与 7,8,9 相同的东西。考虑到搜索的成本,您可能会考虑消除这些。

【讨论】:

  • 感谢您的意见。但我也尝试使用“=”运算符而不是喜欢,但它没有奏效。有没有办法解决我的问题,我会摆脱 nuqta1、nuqta2、nuqta3。谢谢你的建议。
  • 您似乎不太了解 wp_postmeta 的 meta_value 列中的内容。您显然正在使用 Wordpress 插件来处理这种酒店类型的东西。哪个插件?当您使用 SQL 客户端发出以下命令时,您会得到什么? SELECT * FROM wp_postmeta WHERE meta_key IN ('amenities', 'price', 'guests', 'roomtype') 了解这些 wp_values 的实际存储方式是修复查询的先决条件。
  • 不,我没有使用任何 wordpress 插件。还有“SELECT * FROM wp_postmeta WHERE meta_key IN ('amenities', 'price', 'guests', 'roomtype')”这个查询将显示 meta_key 等于设施或价格或客人或房间类型的所有结果,但我想要这个使用“和逻辑运算符”而不是“或逻辑运算符”进行查询。感谢您的快速回复。
  • Tahir,我想弄清楚的正是您的 meta_value 列中的值。你说过你不能用= 搜索它们。问题是,“为什么不呢?”在我的 wordpress 实例中, meta_value 列中有相当干净的值。你的有什么不同?
  • 是的,您是对的“=”运算符工作正常,但查询需要 70 秒才能显示结果。这里有几个我的 (meta_key , meta_value)
    ('guests', '20'), ('roomtype', 'private'), ('price', '$120'), ('bedrooms', '2'), ('浴室', '1') 等等...
【解决方案2】:

尝试使用Fulltext Search

你会做的事情是这样的

SELECT
    *
FROM
    tableName
WHERE
    MATCH ( columnName ) AGAINST ( 'Keyword1', 'Keyword2', 'Keyword3' )

【讨论】:

  • 当我尝试使用此查询时,我收到此错误“使用的表类型不支持 FULLTEXT 索引”。
  • 您的表需要是 MyISAM。
  • 我需要所有表之间的外键和关系,因此我无法将“innoDB”转换为“MYISAM”
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 2020-06-06
  • 2013-01-18
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多