- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Помогите пожалуйста с оптимизацией запроса MySQL, уже что только не перепробовал, выборки по 20-30минут.
Есть база с таблицей "avtozapchasti", в ней миллиард записей, движок Myisam.
Структура таблицы "avtozapchasti":
Поле "id" - INT(13) - Primary key + index
Поле "mazda-323" - varchar(220) - без индекса
Вот поиск по такой таблице очень долгий. По 20-30 минут делается выборка по 30000 ID.
Например есть у меня 30000 ID, нужно вывести по ним поле "mazda-323", делаю такой запрос:
Запрос выполнеятся за 24 минуты. Все ID не перечислил, но их 30000.
Посмотрел explain этого запроса, он не использует индекс ID.
Почему индекс по ID не используется? Как заставить использовать индекс?
Trol, быстрее PK ничего вам не предложат.
Посмотрел explain этого запроса, он не использует индекс ID.
Покажите, мы тоже посмотрим.
в ней миллиард записей, движок Myisam.
Уже "хорошо".. в MyISAM блокировки на уровне таблиц. Данные в таблице изменяются часто?
Если ограничиться двумя значениями WHERE id in (1,2)?
Если подсунуть Force index (`id`) ?
p.s. А точно нужны 30к ID-шников?
IDшники каждый раз в запросе меняются, или они всегда одни и те же(ну например для категории "запчасти для (А)КПП").
Если они фиксированы, то думаю имеет смысл закэшировать запрос, чтобы выполнить его 1 раз, а уже потом просто брать данные из кэша. Если данные меняются периодически, то сделать так, чтобы после замены кэш-запроса обновлялся.
А вообще, если в таблице хранятся все запчасти, то думаю имеет смысл разбить на категории(двигатель(система распределения топлива, ГБЦ), коробка, подвеска).
PS. MyISAM и 1милиард записей, как по мне - кощунство. Особенно если СЕЛЕКТы чаще ИНСЕРТов.
PPS. Вы скажите не что Вы делаете, а что хотите получить(какую цель преследуете). Может есть абсолютно другой подход, но мы об этом и подумать не можем, так как обладаем небольшим кол-вом информации.
Вот Explain по другой таблице, структура таже, индексы теже, только запрос сделал на 167 ID чтобы долго не ждать, запрос выполнился за 0,05сек, но индекс не используется:
ivan-lev, да, нужно вытащить данные по всем 30к ID. Force Index и Use Index не помогают, explain показывает что индекс не используется. Данные в таблице не изменяются, нужно только выборку по ней делать.
Милованов Ю.С, нужно сделать быстрый полнотекстовый поиск. Пробовал Fulltext, но тоже долго ищет. Вот перешёл на Sphinx, но он выдаёт только ID нужных мне записей и приходится делать запрос в БД MySQL для выборки нужных полей с этими ID.
К Sphinx притензий нет, ID выводятся достаточно быстро (секунд 5-10) но вот выборка по этим ID из MySQL очень долгая.
А как в INT поместилось 13 знаков? Должно быть BIGINT ...
Разбить avtozapchasti на avtozapchasti_mazda, avtozapchasti_tazik и т.д., очень сложно?
А как в INT поместилось 13 знаков? Должно быть BIGINT ...
В INT максимальное значение 4294967295 (10 знаков ), об этом не знал, но всёравно, если поле описано как INT(13), это ведь не должно быть причиной такого медленного поиска. В INT 1 миллиард записей поместился.
Разбить avtozapchasti на avtozapchasti_mazda, avtozapchasti_tazik и т.д., очень сложно?
Смысла нет, иначе придётся искать потом по каждой таблице.
А как в INT поместилось 13 знаков? Должно быть BIGINT ...
Откуда взяли 13 знаков?
INT UnSigned: от 0 до (2^32)-1, то есть до 4.294.967.295
ТС, таблица уж сильно большая для мускула. Не говорю что с ней невозможно работать, но желательно разбить на несколько таблиц. Чем меньше записей в таблице - тем лучше, но без фанатизма:)
Смысла нет, иначе придётся искать потом по каждой таблице.
Ну и прекрасно. Делаете СЕЛЕКТ на странице с пунктами "ВАЗ", "ТАЗ", "ГАЗ", "*АЗ" и т.д.
В зависимости от выбранного пункта ищем по определенной таблице. Просто нет смысла держать такую большую БД, если данные из нее можно сгрупировать и разложить на несколько таблиц.
Откуда взяли 13 знаков?
Первый пост ТС.
INT - 10 знаков, при первых 42.... Остальное срежет и промолчит :)
Увидел, что было выше.
Настройки source сфинкса можете показать?
Для конкретного поиска.
Кстати, очень может быть, что множество одиночных селектов выполнится намного быстрее, чем один но большой.
Зачем запчасти для мазды искать в других марках?