Структура полнотекстовой таблицы MySQL

У меня есть база данных с более чем 60 миллионами записей. Текущая настройка состоит из 1 таблицы с 30+ миллионами и парой небольших таблиц с 5 миллионами в каждой. Структура данных одинакова для каждой таблицы. Человек, который создал наш поиск в первый раз (3-4 года назад, до того, как я был здесь), использовал несколько маленьких таблиц. Мы используем match against для каждого соединения. Мой босс и он были под впечатлением, что использование нескольких таблиц позволяет MySQL искать каждую таблицу одновременно. Во всем, что я читал, все говорят, что одна большая таблица была бы лучше, но по мере того, как таблица с 30+ миллионами увеличивается, кажется, что она значительно замедляется, иногда занимая 40+ секунд. Это медленнее, чем должно быть?

Статус выбора

SELECT $stuff FROM table1 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table2 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table3 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table4 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table5 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table6 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table7 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table8 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table9 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table10 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE)

Таблицы MyISAM, а в столбце Name есть полнотекстовый индекс. Table3 содержит более 30 миллионов записей (около 10 ГБ). Будет ли размещение его в одной таблице или разделение значительно увеличить производительность? Я пропустил что-то еще? Или 60+ миллионов записей слишком много, чтобы получить быстрый ответ при полнотекстовом поиске?


person briandonor    schedule 10.01.2013    source источник
comment
Просто потратьте несколько долларов и вставьте в сервер еще одну планку оперативной памяти. Если весь активный набор данных умещается в памяти, на самом деле не имеет значения, как вы разделили его на диске.   -  person Dan Grossman    schedule 11.01.2013
comment
Вы выполняете свои запросы одновременно? Если это так, несколько таблиц могут быть быстрее, но это действительно зависит от того, на каком оборудовании вы работаете.   -  person Michael Mior    schedule 11.01.2013


Ответы (1)


Сначала небольшое замечание. Нет другого реального ответа, кроме как «попробуй изменить». Тем не менее,

Если вы всегда запрашиваете все свои таблицы и в основном читаете, я уверен, что было бы быстрее использовать одну большую таблицу.

Использование объединения (или объединения всех) всегда будет помещать отдельные результаты во временную таблицу, и если эта таблица достаточно велика, она будет создана на диске. Если у вас есть одна большая таблица, вы можете вернуть результат непосредственно клиенту.

Если вы делаете много вставок, они будут быстрее, если вы поместите их в меньшую таблицу (поскольку индекс для обхода меньше.

Однако, если бы вы могли определить, какие таблицы могут возвращать результаты, и просто использовать их в запросе, вы могли бы много выиграть от их разделения. Это также можно сделать с помощью разбиения.

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

person Andreas Wederbrand    schedule 10.01.2013
comment
Благодарность! есть ли переменная, чтобы узнать, при каком размере он начнет записывать данные на диск вместо того, чтобы держать его во временной - person briandonor; 11.01.2013
comment
Да, вы должны прочитать этот dev.mysql.com/ doc/refman/5.5/en/internal-temporary-tables.html, она короткая и перечисляет как переменные, так и то, как проверить, была ли создана новая временная таблица на диске. - person Andreas Wederbrand; 11.01.2013