Производительность запроса SELECT FROM WHERE id 0 быстрее, чем id 1 - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть этот 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

по какой-то причине выполнение "get" занимает по крайней мере в 4 раза больше времени, чем "ожидание", если кто-то может дать мне понимание этой ситуации, я буду очень благодарен.

спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

Хотя для сокращения этого разрыва можно сделать несколько вещей, например, добавить соответствующие индексы, на самом деле не следует предполагать, что запросы будут иметь одинаковое время выполнения только потому, что они выглядят одинаково. Один параметризованный запрос может иметь разное время только на основе значений, используемых для параметров.

В качестве крайнего примера представьте «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 редактируются вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...