Вы обязательно должны иметь составной индекс . Одно поле, содержащее все поля, которые вам нужны в качестве СУБД, в действительности не может использовать более одного индекса для одного запроса.
Предложение OR не совсем подходит для индекса, поэтому, если вы можете, я рекомендую установить status
в NOT NULL . Я предполагаю, что NULL не имеет никакого другого значения от нулевого числа. Это очень поможет на самом деле использовать индекс.
Я не знаю, насколько оптимизирован name != ''
. Семантически равным будет name > ''
(что означает, что это позже в алфавите), возможно, это также сэкономит вам некоторые циклы ЦП.
Затем вы должны решить, в каком порядке будут отображаться ваши столбцы. Эмпирическое правило может быть количество элементов , возможные значения, которые может иметь поле.
Под этим:
ALTER TABLE users ADD INDEX order1 (status, name, id DESC);
Редактировать
Вам не нужно удалять индексы. MySQL очень быстро выберет лучший и проигнорирует все остальное. Они стоят только дисковое пространство и некоторые циклы ЦП на UPDATE
с. Но если они вам не нужны ни при каких обстоятельствах, вы, конечно, можете их удалить.
Долгое время связано с медленным доступом к вашему столу. Вероятно, это вызвано полями динамической длины, такими как TEXT или BLOB. Если они вам ВСЕГДА не нужны, вы можете переместить их на двойной вспомогательный стол, например:
users (id, name, status, group_id)
profile (user_id, birthdate, gender, motto, cv)
Таким образом, основные системные операции могут выполняться с ограниченной информацией о пользователе, а все остальное, что на самом деле является контентом , связанным с пользователем, должно использоваться только тогда, когда это действительно необходимо .
Edit2
Вы указываете MySQL, какой индекс использовать, указав его (или более), например:
SELECT id, name FROM users USE INDEX (order1) WHERE name != '' and status = '0' ORDER BY id DESC