查询性能SELECT FROM WHERE id 0比id 1更快

时间:2018-11-16 17:21:19

标签: php mysql database

我的服务器中有此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;
.....
....
...
..
.
}

,数据库表如下所示:

enter image description here

由于某种原因,如果有人可以让我对这种情况有所了解,请执行“获取”至少要比“待决”花费四倍的时间。

谢谢。

1 个答案:

答案 0 :(得分:0)

虽然可以做些事情来缩小此差距,例如添加适当的索引,但您实际上不应该仅仅因为查询看起来相似而就假定查询将具有相似的执行时间。仅基于用于参数的值,单个参数化查询的时间可能会非常不同。

举一个极端的例子,想象一下在一个百万行表上的“ 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条件几乎排除了{{1} }在一起。