- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,下面的查询并不太复杂,但仍然需要 3 秒多的时间。关于如何优化这个有什么想法吗?
SELECT
wpp.ID, wpp.post_title, wpp.post_author,
wpp.post_status, s.supplier_company
FROM wp_posts AS wpp
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id
LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id
LEFT JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id
LEFT JOIN wp_teleapo_supplier AS s ON wpp.post_author = s.ID
WHERE wpp.post_type = 'post'
AND wpp.post_warning <> 'no_image'
AND wpp.post_status <> 'trash'
AND wpp.post_status <> 'auto-draft'
GROUP BY wpp.ID
ORDER BY post_date DESC
LIMIT 100 OFFSET 0
我所有的 table 现在大约有 2000~9000 个帖子。
1) wp_posts
中有 15000 条记录,但使用 WHERE wpp.post_type = 'post'
时只有 3000 条左右。
2) wp_term_relationships
中大约有 9000 个但在不久的将来很可能会增长......
问题的根源:
在上面的简短查询中,如果我更改:
GROUP BY wpp.ID
ORDER BY post_date DESC
致
GROUP BY wpp.ID
ORDER BY wpp.ID DESC
我的查询时间从 3.3 秒减少到 0.3 秒...但是我想要一种方法,这样我仍然可以ORDER BY post_date
!
更奇怪的是,即使 GROUP 和 ORDER BY 不同,下面的完整搜索查询也能在 1 秒内完成......
解释简短查询的结果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE wpp ref type_status_date,post_type,post_status post_type 62 const 3351 Using where; Using temporary; Using filesort
1 SIMPLE postmeta ref post_id post_id 8 r_11524_jtc.wpp.ID 7 Using index
1 SIMPLE term_link ref PRIMARY PRIMARY 8 r_11524_jtc.wpp.ID 92 Using index
1 SIMPLE terms eq_ref PRIMARY PRIMARY 8 r_11524_jtc.term_link.term_taxonomy_id 1 Using index
1 SIMPLE s eq_ref ID ID 4 r_11524_jtc.wpp.post_author 1
这些是我的索引:
根据用户是否填写某些搜索字段的完整搜索如下。最奇怪的是,即使 ORDER BY
列与 GROUP BY
列不同,下面的搜索查询也只需要 0.3 秒!
SELECT SQL_CALC_FOUND_ROWS wpp.ID, wpp.post_title, wpp.post_author,
wpp.post_status, s.supplier_company,
GROUP_CONCAT(DISTINCT terms.slug SEPARATOR ',') AS allslug,
GROUP_CONCAT(DISTINCT terms.name SEPARATOR ',') AS allcatname
FROM wp_posts AS wpp
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id
LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id
LEFT JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id
LEFT JOIN wp_teleapo_supplier AS s ON wpp.post_author = s.ID
WHERE wpp.post_type = 'post'
AND wpp.post_warning <> 'no_image'
AND wpp.post_status <> 'trash'
AND wpp.post_status <> 'auto-draft' /* All search on post_title
and any postmeta value */
AND (post_title LIKE '%textile%'
OR postmeta.meta_value LIKE '%textile%')
/* extra filters. The one below is an example of a filter on
the user #324 but this field can also take the username
(supplier_company) parameters etc. */
AND ( wpp.post_author LIKE '%324%'
OR ( EXISTS
( SELECT 1
FROM wp_teleapo_supplier as s2
WHERE s2.ID = wpp.post_author
AND (s2.supplier_company LIKE '%324%'
OR s2.supplier_company_kana LIKE '%324%') ) )
OR ( EXISTS
( SELECT 1
FROM wp_postmeta AS postmeta2
WHERE postmeta2.post_id = wpp.ID
AND postmeta2.meta_key = 'input_comp'
AND postmeta2.meta_value LIKE '%324%' ) ) )
GROUP BY wpp.ID /* Filter on Categories!! */
HAVING ( allcatname LIKE '%apparel-and-accessories%'
OR allslug LIKE '%apparel-and-accessories%' )
ORDER BY post_date DESC
LIMIT 20 OFFSET 0
最佳答案
想法A
潜在问题:如果没有 GROUP BY
,您是否会看到一个 wpp.ID
具有多个 supplier_company
值?如果是这样,您想要哪一个?或者您想要GROUP_CONCAT(s.supplier_company)
?
想法B
您希望 supplier_company
出现 NULL
吗?如果是这样,您可能会陷入这个缓慢的查询。 (并归咎于 WP 鼓励的 EAV 架构设计。)
如果您想跳过NULL
,请删除所有LEFT
。使用LEFT
,查询会收集各种 NULL,但最终会丢弃它们。
想法C
此外,如果没有LEFT
,则可以按相反的顺序浏览表格。也就是说,从 wp_teleapo_supplier
开始,查看弹出哪些帖子。 (可能需要更多索引才能按该顺序遵循表格。)
想法D
如果不需要GROUP BY
,请将其删除并将INDEX(post_type)
替换为INDEX(post_type, post_date)
。这样,它可能能够在仅找到 100 行时使用索引停止。或者 post_date
不在 wpp
中??? 请在加入
时限定所有列。
其他
一些评论暗示您遗漏了一些信息。在这种情况下,我的建议可能就没用了。请不要“简化”查询。
s
没有主键
?这是一个禁忌。请提供SHOW CREATE TABLE wp_teleapo_supplier
,以便我们可以讨论 PK 应该是什么。
更长的查询
较长的查询中会出现许多性能 killer
LIKE '%...'
-- 无法使用索引OR
-- 不能使用索引。一种解决方法是将查询重新表述为 UNION
,但考虑到多个 OR
,这将是一场噩梦。GROUP BY
和 ORDER BY
位于不同的列上。即使它们位于同一列上,此查询中也会发生太多事情,无法获得太多好处。OFFSET
闻起来像“分页”。SQL_CALC_FOUND_ROWS
-- 查询必须完成查找所有内容。由于 LIMIT
无法通过索引完成,因此这并不重要。我能想到的唯一希望是在考虑搜索的情况下重新设计架构和 UI。该查询不可能有显着的加速。
关于mysql - 关于优化MySQL查询: Simple MySQL query takes more than 3 seconds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36255948/
我想创建一个对象,比方说一个饼图。 class Pie def initialize(name, flavor) @name = name @flavor = flavor e
我正在寻找类似于 Log property in Linq DataContext 的功能. 最佳答案 所有执行的 SQL 都写入 Trace,因此您可以使用 TraceListener 访问。 关于
使用 django-simple-history ,如何从我的模型中获取最后更改的对象? 我尝试了 MyModel.history.most_recent(),它需要一个模型实例,因此可能会返回所选实
我定期使用 Eclipse 调试器,这一直困扰着我关于 IDE 的问题。步进过滤是一个非常宝贵的工具,这样我就不会进入没有源代码或者我根本不感兴趣的类。但是,Eclipse 在大多数情况下都没有正确处
我基于有向图构建一棵树。源数据是 SQL 表中的一系列父子关系。它肯定是一棵树(无论如何我都会验证)。我想要一组从根到每片叶子的简单路径。数据是会计“科目表”中的标题,路径类似于“根 -> Asset
我对如何在torii中使用ember-simple-auth有点困惑 我正在使用ember-cli-simple-auth和ember-cli-simple-auth-torii 我得到下面提到的错误
考虑以下用 simple-xml 注释注释的枚举: @Root(name="days") public enum DaysOfWeek { SUNDAY("blue", 30), MO
我有一个 json 文件,我正在 excel 中创建一些 vba 代码。我想用java读取这个json文件。为此,我编写了以下代码 try { Class.forName("org.j
我在尝试使用 google 的 simple-json 解析一个简单的 json 时遇到了一个奇怪的问题。 这是我的代码,它不起作用: String s = args[0].toString(); J
我正在尝试解析下面的 json 文件: {"units":[{"id":42, "title":"Hello World", "positi
我正在使用 simple-import-sort eslint 插件进行 react 。我想我的 .eslintrc.js是对的,但我无法使这个特定的插件工作。我在文件的第一行收到以下错误: 未找到规
我正在尝试解析子文件,但我不知道自己做错了什么(当然,我也不知道自己做对了什么)。 文件.json [{ "arrOne":{ "one":"a", "two":"b",
在我的Angel 16(独立的)应用程序中,我有一个简单的服务来测试LangChain和OpenAI。同样的代码在NodeJS应用程序中运行得非常好,然而,当从角度运行时,OpenAI返回的结果总是空
我正在尝试测试连接到数据库的 Web 应用程序 - 我的 Junit 代码不执行连接。 设置按照 https://github.com/h-thurow/Simple-JNDI InitialCont
我正在尝试制作一个小型应用程序,它可以通过 ISBN 在亚马逊上搜索一本书。我是 Amazon Web Service 的新手。 我正在关注以下链接: http://flyingpies.wordpr
我正在使用简单 XML 序列化 (simple-xml-2.6.6.jar) here将我的 XML 响应从 webservice 转换为 POJO 类。 XML 是:
Simple UI混合开发的必经之路~ Simple UI快速上手 在混合开发的模式下,如果想使用django admin,又嫌弃后台不符合你的审美?Simple UI给你想要的答案,我不是打广告的~
Simple JSON是Google开发的Java JSON解析框架,基于Apache协议。 下载的文件是:json_simple.jar 例子1:很方便的方式,使用JSONValue
我有一个 simple_form 表单设置,它会很好地显示内联错误。我遇到过一些用户看不到这些错误的问题,并要求在非常长的表格顶部进行清晰的枚举。我使用了 Rails 教程中的代码设置:
我正在使用简单的 XML 框架,只是重命名了一些 XML 布局,这些布局现在似乎不再起作用了。 这是我的 XML: 2 0 1
我是一名优秀的程序员,十分优秀!