powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из большой таблицы по большому количеству полей
14 сообщений из 14, страница 1 из 1
Выборка из большой таблицы по большому количеству полей
    #38721265
Данилко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет. Есть таблица пользователей. Мне нужно реализовать поиск пользователей по нескольким полям. Получается приблизительно такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$DB->query("SELECT user_id
FROM users_testing
FORCE INDEX(search)
WHERE user_last_active < 1408091106
AND user_hide < 1408077887
AND user_id NOT
IN ( 1, 17 )
AND user_rate >=0
AND user_rate <=500
AND user_is_bot =0");



Разумеется из всех этих полей создан составной индекс 'search'
Таблица InnoDB. Записей 1 000 000. Запрос выполняется 1,6 секунды.
Лимит использовать не могу, т.к. все юзеры должны равновероятно находиться поиском в 1 запрос.

Что можно придумать? Может стоит использовать какой-то другой инструмент и хранилище для подобного поиска?
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721269
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДанилкоРазумеется из всех этих полей создан составной индекс 'search'Набор полей в поиске всегда один и тот же?
Порядок полей в индексе какой?
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721276
Данилко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftДанилкоРазумеется из всех этих полей создан составной индекс 'search'Набор полей в поиске всегда один и тот же?
Порядок полей в индексе какой?

Набор в запросе всегда одинаков.
Порядок в индексе играет роль? У меня такой:
user_last_active 204171 A Нет
user_hide 204171 A Нет
user_is_bot 204171 A Нет
user_id 1020859 A Нет
user_rate 1020859 A Нет
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721285
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДанилкоПорядок в индексе играет роль?Еще как играет.
Начинать надо с тех полей, по которым происходит точное сравнение на равенство.
А дальше "не все так однозначно". Попробуйте создавать индекс с разным порядком полей, возможно, что-то получится.
А сейчас индекс используется только как покрывающий индекс, не более того.
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721349
Данилко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftДанилкоПорядок в индексе играет роль?Еще как играет.
Начинать надо с тех полей, по которым происходит точное сравнение на равенство.
А дальше "не все так однозначно". Попробуйте создавать индекс с разным порядком полей, возможно, что-то получится.
А сейчас индекс используется только как покрывающий индекс, не более того.

Как-то не спасает. Выкинул пока проверку NOT IN по user_id. Построил:
user_is_bot 2 A Нет
user_rate 1004 A Нет
user_last_active 1020859 A Нет
user_hide 1020859

1.2 секунды, но это за счет выкидыша user_id. С лимитом запрос летает. Т.е. если поставить LIMIT 100, то время выполнения этого же запроса 0.001. Может проблема как раз в количестве данных выборки? Без лимита их около 500к
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721352
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДанилкоМожет проблема как раз в количестве данных выборки? Без лимита их около 500кТогда и "1.2 секунды" - очень неплохое время.
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721360
Данилко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftДанилкоМожет проблема как раз в количестве данных выборки? Без лимита их около 500кТогда и "1.2 секунды" - очень неплохое время.

Т.е. более быстрее выполнить этот запрос в mysql у меня не получится?
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721365
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данилкоmiksoftпропущено...
Тогда и "1.2 секунды" - очень неплохое время.

Т.е. более быстрее выполнить этот запрос в mysql у меня не получится?По крайней мере, я сходу не вижу, как можно это кардинально улучшить.
Улучшить чуть-чуть можно попробовать изменяя порядок и состав полей в индексе (он в любом случае будет использоваться как покрывающий, но не для ускорения фильтрации). Или даже вовсе отказаться от индекса.
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721367
Данилко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

В каком смысле отказаться?
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721368
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данилкоmiksoft,

В каком смысле отказаться?В прямом. Удалить его.
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721374
Данилко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

ну если составной не юзать, а просто повешать индексы на все поля, то еще медленнее выполняется
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721387
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данилкоmiksoft,

ну если составной не юзать, а просто повешать индексы на все поля, то еще медленнее выполняетсяЯ имел в виду совсем без индекса, даже без по отдельным полям.
Все равно же выполняется сканирование всего индекса. А сканировать индекс или таблицу - разница уже невелика, если, конечно, в таблице еще не 100500 полей.
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721391
Данилко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

еще +35 :)
...
Рейтинг: 0 / 0
Выборка из большой таблицы по большому количеству полей
    #38721396
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данилкоmiksoft,

еще +35 :)Еще 35 полей? Тогда, вероятно, исходный индекс имеет смысл оставить.

Еще хорошо бы убедиться, что innodb_buffer_pool_size достаточен, чтобы в него влезли все используемые таблицы и их индексы.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из большой таблицы по большому количеству полей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]