使用子查询和限制/偏移提高mySQL查询速度

使用子查询和限制/偏移提高mySQL查询速度,mysql,wordpress,Mysql,Wordpress,我正在努力提高我的查询速度。它需要30秒来加载,即使我已将其限制为12秒。我使用子查询获取所有使用当前选定数据的公司,并按公司的最高计数排序。下面是我的问题。如果我添加一个特定的查询。示例查询=测试它更快 $get_query = isset($_REQUEST['query']) ? $_REQUEST['query'] : ''; $get_all_vendors = $wpdb->get_results( "SELECT tbl1.ID AS vendor_i

我正在努力提高我的查询速度。它需要30秒来加载,即使我已将其限制为12秒。我使用子查询获取所有使用当前选定数据的公司,并按公司的最高计数排序。下面是我的问题。如果我添加一个特定的查询。示例查询=测试它更快

$get_query = isset($_REQUEST['query']) ? $_REQUEST['query'] : '';           
$get_all_vendors = $wpdb->get_results( "SELECT tbl1.ID 
AS vendor_id, tbl1.post_title AS vendor_name,

(SELECT COUNT(*) AS total_companies
FROM {$wpdb->prefix}posts tbl2 

LEFT JOIN {$wpdb->prefix}postmeta as tbl3 ON tbl2.ID=tbl3.post_id AND tbl3.meta_key = 'vendor-ap'           
LEFT JOIN {$wpdb->prefix}postmeta as tbl4 ON tbl2.ID=tbl4.post_id AND tbl4.meta_key = 'vendor-as'
LEFT JOIN {$wpdb->prefix}postmeta as tbl5 ON tbl2.ID=tbl5.post_id AND tbl5.meta_key = 'vendor-data'
LEFT JOIN {$wpdb->prefix}postmeta as tbl6 ON tbl2.ID=tbl6.post_id AND tbl6.meta_key = 'vendor-management'
LEFT JOIN {$wpdb->prefix}postmeta as tbl7 ON tbl2.ID=tbl7.post_id AND tbl7.meta_key = 'vendor-sr'
LEFT JOIN {$wpdb->prefix}postmeta as tbl8 ON tbl2.ID=tbl8.post_id AND tbl8.meta_key = 'vendor-ae'

WHERE (tbl2.post_type = 'company-stacks' 
AND tbl2.post_status = 'publish')
AND tbl3.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%')
OR tbl4.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl5.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl6.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl7.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl8.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') ) AS featured_stackies

FROM {$wpdb->prefix}posts tbl1 
WHERE tbl1.post_type = 'vendor-stacks' 
AND tbl1.post_status = 'publish' 
AND tbl1.post_title LIKE '%".$get_query."%'

GROUP BY tbl1.ID ORDER BY featured_stackies DESC LIMIT 12 OFFSET 0", OBJECT);

echo '<pre>';
    print_r($get_all_vendors);
echo '</pre>';
$get\u query=isset($\u请求['query'])$_请求['query']:'';
$get_all_vendors=$wpdb->get_results(“选择tbl1.ID
作为供应商id,tbl1.post_标题作为供应商名称,
(选择计数(*)作为公司总数
从{$wpdb->prefix}帖子tbl2
左连接{$wpdb->prefix}postETA作为tbl2.ID=tbl3.post_ID和tbl3.meta_key='vendor ap'
左连接{$wpdb->prefix}postETA为tbl2上的tbl4.ID=tbl4.post_ID和tbl4.meta_key='vendor as'
左连接{$wpdb->prefix}postETA作为tbl2上的tbl5.ID=tbl5.post_ID和tbl5.meta_key='vendor data'
左连接{$wpdb->prefix}postETA作为tbl2上的tbl6.ID=tbl6.post_ID和tbl6.meta_key='vendor management'
左连接{$wpdb->prefix}postETA为tbl2上的tbl7.ID=tbl7.post_ID和tbl7.meta_key='vendor sr'
左连接{$wpdb->prefix}postETA作为tbl2.ID=tbl8.post_ID和tbl8.meta_key='vendor ae'
其中(tbl2.post_type='公司堆栈'
和tbl2.post_status='publish')
和tbl3.meta_值,如CONCAT(“%\”,tbl1.ID,“\”%)
或tbl4.meta_值,如CONCAT(“%\”,tbl1.ID,“\”%”)
或tbl5.meta_值,如CONCAT(“%\”,tbl1.ID,“\”%”)
或tbl6.meta_值,如CONCAT(“%\”,tbl1.ID,“\”%”)
或tbl7.meta_值,如CONCAT(“%\”,tbl1.ID,“\”%”)
或者像CONCAT(“%\”,tbl1.ID,“\”%”)这样的tbl8.meta值作为特征值
从{$wpdb->prefix}帖子tbl1
其中tbl1.post_type='供应商堆栈'
和tbl1.post_status='publish'
和tbl1.post_title类似“%”“$get_query.”
按tbl1.ID按功能分组(stackies DESC LIMIT 12偏移量0“,对象);
回声';
打印(获取所有供应商);
回声';
现在数据库中总共有290行

已更新
我认为导致查询加载缓慢的原因是,根据MySQL架构和速度优化原则,特色的_stackies的顺序是

JOIN
查询作为子查询不是一种好的做法

尝试直接加入主查询

您当前的查询正在尝试执行

posts
postETA
通过六个联接进行联接,将其作为主查询的一部分,原因是主查询也在
posts
表上进行选择

也许你可以试试这个

上述查询将使处理变得简单,如下所示

还可以根据以下规则更改
WHERE
条件的顺序

优化1:

WHERE
中的哪个键或主键将把数据减少到最小值,然后在WHERE条件比较序列中将该比较放在前面

例如:
tbl1.post\u类型='vendor stacks'和tbl1.post\u状态='publish'和tbl1.post\u类型='company stacks'

如果
公司堆栈
将您的200日期设置为10,则将顺序更改为


tbl1.post\u type='company stacks'和tbl1.post\u status='publish'和tbl1.post\u type='vendor stacks'

太棒了!谢谢你。我将更新当前查询并删除子查询。原因是多方面的。一个原因是“…”不能使用index@Strawberry对我试图添加一个带有百分比的静态id。例如,170%运行速度很快。这是主要问题。我正在尝试用双引号获取ID。所以我尝试了Concat函数。我怎么能得到这个?应该是%“170%”你没抓住我的重点。尝试对数据进行结构化,以便不需要开头通配符(%)
SELECT 
tbl1.ID AS vendor_id, 
tbl1.post_title AS vendor_name,
COUNT(tbl1.ID) AS featured_stackies
FROM {$wpdb->prefix}posts tbl1
LEFT JOIN {$wpdb->prefix}postmeta as tbl3 ON tbl1.ID=tbl3.post_id AND tbl3.meta_key = 'vendor-ap'           
LEFT JOIN {$wpdb->prefix}postmeta as tbl4 ON tbl1.ID=tbl4.post_id AND tbl4.meta_key = 'vendor-as'
LEFT JOIN {$wpdb->prefix}postmeta as tbl5 ON tbl1.ID=tbl5.post_id AND tbl5.meta_key = 'vendor-data'
LEFT JOIN {$wpdb->prefix}postmeta as tbl6 ON tbl1.ID=tbl6.post_id AND tbl6.meta_key = 'vendor-management'
LEFT JOIN {$wpdb->prefix}postmeta as tbl7 ON tbl1.ID=tbl7.post_id AND tbl7.meta_key = 'vendor-sr'
LEFT JOIN {$wpdb->prefix}postmeta as tbl8 ON tbl1.ID=tbl8.post_id AND tbl8.meta_key = 'vendor-ae'
WHERE tbl1.post_type = 'vendor-stacks' 
AND tbl1.post_status = 'publish' 
AND tbl1.post_title LIKE '%".$get_query."%'
AND ( tbl1.post_type = 'company-stacks' 
AND tbl1.post_status = 'publish')
AND tbl3.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%')
OR tbl4.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl5.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl6.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl7.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl8.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%')

GROUP BY tbl1.ID ORDER BY featured_stackies DESC LIMIT 12 OFFSET 0