Хотя для сокращения этого разрыва можно сделать несколько вещей, например, добавить соответствующие индексы, на самом деле не следует предполагать, что запросы будут иметь одинаковое время выполнения только потому, что они выглядят одинаково. Один параметризованный запрос может иметь разное время только на основе значений, используемых для параметров.
В качестве крайнего примера представьте «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
редактируются вместе.