首页 > 解决方案 > 查询性能 SELECT FROM WHERE id 0 比 id 1 快

问题描述

我的服务器中有这个 php 代码

$social = array();
    $id = $db->idFromUsername($username);
    switch ($_POST['action']) {
        case 'GET':
            $query = 'SELECT user_one_id, user_two_id FROM social WHERE (user_one_id=? OR user_two_id=?) AND status=1';
            foreach ($db->queryExecute($query, $id, $id) as $relationship) {
                $friend = array();
                $friend['username'] = $db->usernameFromId($relationship['user_one_id'] == $id ? $relationship['user_two_id'] : $relationship['user_one_id']);
                $friend['userImage'] = getUserImage($friend['username']);
                $social[] = $friend;
                $status = 'true';
            }
            break;
        case 'PENDING':
            $query = 'SELECT user_one_id, user_two_id FROM social WHERE (user_one_id=? OR user_two_id=?) AND action_user_id!=? AND status=0';
            foreach ($db->queryExecute($query, $id, $id, $id) as $pending) {
                $person = array();
                $person['username'] = $db->usernameFromId($pending['user_one_id'] == $id ? $pending['user_two_id'] : $pending['user_one_id']);
                $person['userImage'] = getUserImage($person['username']);
                $social[] = $person;
                $status = 'true';
            }
            break;
.....
....
...
..
.
}

数据库表如下所示:

在此处输入图像描述

出于某种原因,如果有人能给我关于这种情况的见解,那么“get”的执行时间至少比“pending”长 4 倍,我将不胜感激。

谢谢你。

标签: phpmysqldatabase

解决方案


虽然可以采取一些措施来缩小这种差距,例如添加适当的索引,但您真的不应该仅仅因为查询看起来相似就假设查询将具有相似的执行时间。仅基于用于参数的值,单个参数化查询可能具有非常不同的时间。

举个极端的例子,想象一下“WHERE id = 0”与“WHERE id = 1”在一个数百万行的表上,其中大多数行的 id=1,几乎没有行的 id=0。如果没有索引,两个查询的“查找”时间可能会相似,因为缺少索引需要进行全表扫描;但是其中一个收集和传输的数据量将比另一个多得多。使用索引,查找时间将大大减少,但即便如此,您仍然必须传输所有数据。

长话短说,从您显示的两个查询中,您的最佳索引可能是(status, action_user_id)按该顺序排列的复合索引;该status部分将(根据数据猜测)将检查的行缩小一半,并且该action_user_id部分将进一步缩小(取决于正在搜索的值的唯一性)。颠倒顺序意味着第一个查询根本无法利用索引。

包含user_two_id和/或user_two_id可能不会对这些查询有帮助的索引,因为OR条件几乎会丢弃任何潜在的索引用于被OR一起编辑的条件。


推荐阅读