简体   繁体   English

优化此 SQL 查询?

[英]Optimization for this SQL query?

I have a WordPress site and I make a query to get all the users that have a specific capability/range.我有一个 WordPress 网站,我进行了查询以获取具有特定功能/范围的所有用户。 From the list, I get a "meta_value" that has a timestamp, and then I check if it is less than the current time (expired)从列表中,我得到一个带有时间戳的“meta_value”,然后我检查它是否小于当前时间(已过期)

$sql = "SELECT user_id
FROM  `wp_usermeta` 
WHERE  `meta_key` =  'wp_capabilities'
AND  `meta_value` LIKE  '%\"premium\"%'";

$query = mysqli_query($cn, $sql);

while ($row = mysqli_fetch_array($query))
{
    $user_id = $row["user_id"];

    $sql = "SELECT meta_value
    FROM  `wp_usermeta` 
    WHERE  `meta_key` = '_expire_user_date'
    AND user_id = '$user_id'";

    $query_time = mysqli_query($cn, $sql);
    $rows_query_time = mysqli_fetch_array($query_time);
    $expire_user_date = $rows_query_time["meta_value"];

    $now = time();

    if ($expire_user_date && $now > $expire_user_date)
    {
        echo $user_id." expired<br>";
    }
}

It's possible to use JOIN or something to optimize the query?可以使用 JOIN 或其他东西来优化查询吗?

Thanks in advance提前致谢

Try self join query on usermeta table in WordPress在 WordPress 中尝试对usermeta表进行自usermeta查询

SELECT * FROM `wp_usermeta` um1 join `wp_usermeta` um2 
ON um1.user_id = um2.user_id 
AND um1.meta_key =  'wp_capabilities' 
AND um1.meta_value LIKE '%premium%' 
AND  `um2`.`meta_key` = '_expire_user_date

Left Join or subquery will work. Left Joinsubquery将起作用。 I think Left Join will be optimal one我认为Left Join将是最佳选择

"SELECT umeta.user_id, 
         exmeta.meta_value as meta_value
     FROM  `wp_usermeta` AS umeta 
     LEFT JOIN `wp_usermeta` AS exmeta
        ON umeta.user_id = exmeta.user_id
        WHERE  umeta.`meta_key` =  'wp_capabilities'
            AND  umeta.`meta_value` LIKE  '%\"premium\"%'
            AND  exmeta.`meta_key` = '_expire_user_date'

";

But easiest one is subquery which is little bit slower than left join但最简单的是subquery ,它比左连接慢一点

"SELECT user_id, 
        (SELECT meta_value
             FROM `wp_usermeta` 
                 WHERE user_id = umeta.user_id
                       AND `meta_key` = '_expire_user_date' 
                 LIMIT 1
        ) as meta_value
FROM  `wp_usermeta` AS umeta 
WHERE  `meta_key` =  'wp_capabilities'
AND  `meta_value` LIKE  '%\"premium\"%'";

It's better to let the database manage the filtering.最好让数据库管理过滤。 Try something like this:尝试这样的事情:

"SELECT user_id
FROM  `wp_usermeta` 
WHERE  `meta_key` =  'wp_capabilities'
AND  `meta_value` LIKE  '%\"premium\"%'"
AND 'timestamp_column' > NOW()

Than you get all the "expired" rows.比你得到所有“过期”的行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM