2017-08-25 72 views
0

我正在做一些关于WordPress数据的分析,我目前有一个本地的SQLite数据库与一些相关的表和一个python脚本来做分析。我目前运行这个查询,运行速度很慢。我有可能进行快了很多的感觉,但我不能确定如何:想知道如何使这个SQL(SQLite3)查询更有效

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

您是否尝试制作表格,即与元键匹配的子查询?否则,metakeys上的索引可能会加速。 – Yunnosch

+1

请提供您的模式和几行“插入...”来制作[mcve]。 – Yunnosch

+0

https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Yunnosch

回答

0

使用连接获取其他字段,然后使用GROUP BY删除所有重复的行是效率低下的。

更好地根据需要只返回尽可能多的行的查询开始,并与correlated subqueries的收集其他值:

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_idmeta_key两列索引反而会更好。此外,meta_key本身应该编入索引。

相关问题