我正在对WordPress数据进行一些分析,我目前有一个本地SQLite数据库,其中包含一些相关的表和一个python脚本来进行分析。我目前运行此查询,运行速度相当慢。我觉得它可以加快速度,但我不确定如何:
SELECT
wp_postmeta.post_id,
wp_postmeta2.meta_value address,
wp_postmeta3.meta_value postal,
wp_postmeta4.meta_value city,
wp_postmeta5.meta_value email,
wp_postmeta6.meta_value firstname,
wp_postmeta7.meta_value lastname,
wp_postmeta8.meta_value soort,
wp_postmeta9.meta_value stamboek_1,
wp_postmeta10.meta_value stamboek_2,
wp_postmeta11.meta_value stamboek_3,
wp_postmeta12.meta_value stamboek_4,
wp_postmeta13.meta_value phone
FROM
wp_postmeta
LEFT JOIN wp_postmeta as wp_postmeta2 ON wp_postmeta.post_id = wp_postmeta2.post_id AND wp_postmeta2.meta_key = '_abo_address'
LEFT JOIN wp_postmeta AS wp_postmeta3 ON wp_postmeta.post_id = wp_postmeta3.post_id AND wp_postmeta3.meta_key = '_abo_postal'
LEFT JOIN wp_postmeta AS wp_postmeta4 ON wp_postmeta.post_id = wp_postmeta4.post_id AND wp_postmeta4.meta_key = '_abo_city'
LEFT JOIN wp_postmeta AS wp_postmeta5 ON wp_postmeta.post_id = wp_postmeta5.post_id AND wp_postmeta5.meta_key = '_abo_email'
LEFT JOIN wp_postmeta AS wp_postmeta6 ON wp_postmeta.post_id = wp_postmeta6.post_id AND wp_postmeta6.meta_key = '_abo_firstname'
LEFT JOIN wp_postmeta AS wp_postmeta7 ON wp_postmeta.post_id = wp_postmeta7.post_id AND wp_postmeta7.meta_key = '_abo_lastname'
LEFT JOIN wp_postmeta AS wp_postmeta8 ON wp_postmeta.post_id = wp_postmeta8.post_id AND wp_postmeta8.meta_key = '_abo_soort'
LEFT JOIN wp_postmeta AS wp_postmeta9 ON wp_postmeta.post_id = wp_postmeta9.post_id AND wp_postmeta9.meta_key = '_abo_stamboek_1'
LEFT JOIN wp_postmeta AS wp_postmeta10 ON wp_postmeta.post_id = wp_postmeta10.post_id AND wp_postmeta10.meta_key = '_abo_stamboek_2'
LEFT JOIN wp_postmeta AS wp_postmeta11 ON wp_postmeta.post_id = wp_postmeta11.post_id AND wp_postmeta11.meta_key = '_abo_stamboek_3'
LEFT JOIN wp_postmeta AS wp_postmeta12 ON wp_postmeta.post_id = wp_postmeta12.post_id AND wp_postmeta12.meta_key = '_abo_stamboek_4'
LEFT JOIN wp_postmeta AS wp_postmeta13 ON wp_postmeta.post_id = wp_postmeta13.post_id AND wp_postmeta13.meta_key = '_abo_phone'
WHERE wp_postmeta.post_id IN (SELECT post_id from `wp_postmeta` WHERE ( meta_key = '_abo_magazine_tegoed' AND meta_value <> 0 ))
GROUP BY wp_postmeta.post_id
这个想法基本上是转置所选的post_id,meta_value和meta_key结果。
我没有非常高级的SQL技能,谷歌搜索没有产生那么多有用的结果。该查询运行良好,但我不知道如何更快地进行查询。我非常期待你的任何建议!
答案 0 :(得分:0)
使用连接获取其他字段,然后使用GROUP BY删除所有重复的行效率低下。
最好从一个只返回所需行数的查询开始,然后使用correlated subqueries收集其他值:
3,143,856
如果SELECT post_id,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_address' ) AS address,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_postal' ) AS postal,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_city' ) AS city,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_email' ) AS email,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_firstname' ) AS firstname,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_lastname' ) AS lastname,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_soort' ) AS soort,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_stamboek_1') AS stamboek_1,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_stamboek_2') AS stamboek_2,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_stamboek_3') AS stamboek_3,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_stamboek_4') AS stamboek_4,
(SELECT meta_value FROM wp_postmeta
WHERE post_id = m.post_id AND meta_key = '_abo_phone' ) AS phone
FROM wp_postmeta AS m
WHERE meta_key = '_abo_magazine_tegoed'
AND meta_value <> 0;
列没有索引,此查询仍然会很慢;但post_id
,post_id
上的两列索引会更好。此外,meta_key
本身应编入索引。