想知道如何使这个SQL(SQLite3)查询更有效

时间:2017-08-25 16:14:59

标签: sql sqlite

我正在对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技能,谷歌搜索没有产生那么多有用的结果。该查询运行良好,但我不知道如何更快地进行查询。我非常期待你的任何建议!

1 个答案:

答案 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_idpost_id上的两列索引会更好。此外,meta_key本身应编入索引。