2013-05-16 3 views
1

Мне нужно индексировать огромную базу данных mysql (5 миллиардов записей). я редко создавать, обновлять или удалятьБыстрый поиск по огромной базе данных mysql

только некоторые запрос как SELECT * FROM tbl_person где имя LIKE «Foo%»

Я уже установил мой индекс на поле.

С одним будет лучше для лучшей производительности по запросу чтения

1 один запрос на столе 5billions записей или 10 запроса на таблицу 500millions записей и присоединиться результат после.

+1

Это, скорее всего, будет зависеть от запроса/того, сколько места занимает ваш индекс/сколько у вас памяти или что еще делает машина/какая у вас дисковая система или несколько десятков других вещей. Лучшее, что вы можете сделать, если вы не хотите, чтобы полная догадка была проверкой с использованием вашего собственного оборудования. –

ответ

1

Вы никогда не получите «хорошую» производительность, используя предложение LIKE на MySQL db этого размера, потому что не может не использовать индекс.

Если вам нужны такие эффективные запросы, то вам следует рассмотреть различные варианты хранения. Общим методом является наличие отдельных индексированных столбцов для каждой длины строки.

Например:

  1. FOOBAR
  2. fooba
  3. foob
  4. Foo
  5. Ф.О.
  6. е

вы значительно увеличить данные на вашем складе , но ваши требования покажут, является ли это подходящим компромиссом ... это пространство дешевле, чем производительность? Только вы знаете ответ.

EDIT: Я вижу вторую часть вашего вопроса, сейчас. Вы спрашиваете, является ли это лучше иметь один запрос на 5б записей или 10 запросов на 50ой гею и UNION результата ....

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

+0

Будет зависеть от запросов, 'LIKE' (как примерный запрос), который не начинается с подстановочного знака, должен использовать индекс просто отлично. «% endswith» - это очень плохой шаблон. –

+0

Да, 'LIKE startswith%' является sargable, как указано, но я думаю, что OP занижает вопрос. Если он использует индекс соответствующим образом, то есть fer * simple * исправления, которые он может применить. – Matthew

+0

Если вы забыли LIKE ключевое слово 1 один запрос (5billions запись) SELECT * из tbl_person WHERE имя = 'Foo' или 10 запросов (500millions запись) SELECT * из tbl_person WHERE имя = 'Foo' –

6

Есть много вещей, которые вы можете сделать. Во-первых, если вы регулярно проводите поиск по имени человека, подумайте о том, чтобы разделить свою таблицу на первые или первые несколько букв имени лица. См. Partitioning Types.

Например, поскольку Целые гораздо быстрее искать по, можно сделать поле, называемым name_abbr, что является SMALLINT, который представляет лицо, первые 2 или 3 буквы имени. Вы должны индексировать и разделять это поле! Итак, aaa будет 1, aab будет 2 и так далее. Ваш запрос будет выглядеть следующим образом:

SELECT * FROM Table WHERE name_abbr=123 AND name LIKE 'foo%'; 

Теперь, это ударит правильный раздел и LIKE будет иметь только проверить на гораздо меньшем наборе записей.

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

+0

хорошая идея, спасибо. –

+0

+1 для предложения - Разделение идеи. – Alyas

Смежные вопросы