Помогите оптимизировать запрос MySQL

12 3
T
На сайте с 28.06.2007
Offline
82
1756

Помогите пожалуйста с оптимизацией запроса MySQL, уже что только не перепробовал, выборки по 20-30минут.

Есть база с таблицей "avtozapchasti", в ней миллиард записей, движок Myisam.

Структура таблицы "avtozapchasti":

Поле "id" - INT(13) - Primary key + index

Поле "mazda-323" - varchar(220) - без индекса

Вот поиск по такой таблице очень долгий. По 20-30 минут делается выборка по 30000 ID.

Например есть у меня 30000 ID, нужно вывести по ним поле "mazda-323", делаю такой запрос:

SELECT `mazda-323` FROM `avtozapchasti` WHERE `id` IN (6439,11797,16953,23818,170396,179690,187210,197938,209959,243367,244855,338086,378949,398858,404790,513226,518610,531893,546933,553379,624933,657555,667464,671771,676247,730161,732732,777653,780854,784196,785011,799350,800288,826096,826430,850690,862463,862464,862465,862466,862467,862468,862469,862470,873842,882750,888372,888373,889033,919909,921041,943575,946192,981409,996298,996299,997993,1024488,1026543,1026544,1026545,1026546,1054933,1066972,1066973,1074653,1074654,1074655,1078509,1138124,1151959,1152039,1152079,1166038,1176147,1201139,1232014,1271064,1301581,1301582,1301583,1301584,1301585,1301586,1301587,1301588,1301589,1307160,1329851,1330260,1330261,1330894,1330910,1330911,1355720,1355721,1355722,1359212,1359213,1359214,1359215,1392052,1396236,1413614,1413615,1413695,1420419,1466347,1466717,1466719,1487575,1491527,1491622,1501642,1529092,1594561,1616126,1657718,1673293,1742829,1742835,1773937,1776136,1892935,1926000,1950087,1950088,1950089,1950090,1950091,1950092,1975720,1975721,1975722,1975849,1979948,1979949,1979950,1979951,1979952,1979953,2062084,2078689,2101897,2137942,2174842,2220901,2239852,2261560,2273354,2304155,2329626,2329874,2340713,2353582,2414130,2417291,2435246,2458007,2461925,2466057,2507814,2522939,2600106,2600107,2677535,2702305)

Запрос выполнеятся за 24 минуты. Все ID не перечислил, но их 30000.

Посмотрел explain этого запроса, он не использует индекс ID.

Почему индекс по ID не используется? Как заставить использовать индекс?

skAmZ
На сайте с 04.09.2009
Offline
122
#1

Trol, быстрее PK ничего вам не предложат.

Trol:
Посмотрел explain этого запроса, он не использует индекс ID.

Покажите, мы тоже посмотрим.

IL
На сайте с 20.04.2007
Offline
435
#2
Trol:
в ней миллиард записей, движок Myisam.

Уже "хорошо".. в MyISAM блокировки на уровне таблиц. Данные в таблице изменяются часто?

Если ограничиться двумя значениями WHERE id in (1,2)?

Если подсунуть Force index (`id`) ?

p.s. А точно нужны 30к ID-шников?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#3

IDшники каждый раз в запросе меняются, или они всегда одни и те же(ну например для категории "запчасти для (А)КПП").

Если они фиксированы, то думаю имеет смысл закэшировать запрос, чтобы выполнить его 1 раз, а уже потом просто брать данные из кэша. Если данные меняются периодически, то сделать так, чтобы после замены кэш-запроса обновлялся.

А вообще, если в таблице хранятся все запчасти, то думаю имеет смысл разбить на категории(двигатель(система распределения топлива, ГБЦ), коробка, подвеска).

PS. MyISAM и 1милиард записей, как по мне - кощунство. Особенно если СЕЛЕКТы чаще ИНСЕРТов.

PPS. Вы скажите не что Вы делаете, а что хотите получить(какую цель преследуете). Может есть абсолютно другой подход, но мы об этом и подумать не можем, так как обладаем небольшим кол-вом информации.

Подпись))
T
На сайте с 28.06.2007
Offline
82
#4

Вот 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 очень долгая.

medexpert
На сайте с 19.02.2012
Offline
83
#5

А как в INT поместилось 13 знаков? Должно быть BIGINT ...

Разбить avtozapchasti на avtozapchasti_mazda, avtozapchasti_tazik и т.д., очень сложно?

"... Нет того веселья: Или куришь натощак, Или пьёшь с похмелья."
T
На сайте с 28.06.2007
Offline
82
#6
medexpert:
А как в INT поместилось 13 знаков? Должно быть BIGINT ...

В INT максимальное значение 4294967295 (10 знаков ), об этом не знал, но всёравно, если поле описано как INT(13), это ведь не должно быть причиной такого медленного поиска. В INT 1 миллиард записей поместился.

medexpert:
Разбить avtozapchasti на avtozapchasti_mazda, avtozapchasti_tazik и т.д., очень сложно?

Смысла нет, иначе придётся искать потом по каждой таблице.

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#7
medexpert:
А как в INT поместилось 13 знаков? Должно быть BIGINT ...

Откуда взяли 13 знаков?

INT UnSigned: от 0 до (2^32)-1, то есть до 4.294.967.295

ТС, таблица уж сильно большая для мускула. Не говорю что с ней невозможно работать, но желательно разбить на несколько таблиц. Чем меньше записей в таблице - тем лучше, но без фанатизма:)

Trol:
Смысла нет, иначе придётся искать потом по каждой таблице.

Ну и прекрасно. Делаете СЕЛЕКТ на странице с пунктами "ВАЗ", "ТАЗ", "ГАЗ", "*АЗ" и т.д.

В зависимости от выбранного пункта ищем по определенной таблице. Просто нет смысла держать такую большую БД, если данные из нее можно сгрупировать и разложить на несколько таблиц.

medexpert
На сайте с 19.02.2012
Offline
83
#8
Милованов Ю.С:
Откуда взяли 13 знаков?

Первый пост ТС.

INT - 10 знаков, при первых 42.... Остальное срежет и промолчит :)

Увидел, что было выше.

iexpert
На сайте с 01.09.2005
Offline
184
#9

Настройки source сфинкса можете показать?

Для конкретного поиска.

Кстати, очень может быть, что множество одиночных селектов выполнится намного быстрее, чем один но большой.

Бойтесь ваших желаний, ибо они могут исполниться
medexpert
На сайте с 19.02.2012
Offline
83
#10

Зачем запчасти для мазды искать в других марках?

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий