2010-12-29 2 views
2

На моем веб-сайте я экспериментирую с очень большими таблицами. У одного «элемента» таблицы есть около 2 миллионов записей, а у второго - «items_parents» около 6 миллионов. Удивительно, что мне нужно присоединиться к этим столам. Когда я пытаюсь, например, эту команду SQL в MySQL:Ускорение работы с огромными таблицами SQL

SELECT * 
FROM `items_parent` 
JOIN items ON items_parent.id = items.id 
WHERE items_parent.parent = 4706421 

занимает около 7 секунд, что просто слишком долго для веб-сайта. На обеих таблицах у меня есть двойные индексы (типа BTREE) на 1. Идентификатор и имя - на 2. Идентификатор и родитель. Я не знаю много об использовании индексов, чтобы быть честным, но лучше ли иметь два общих индекса правильно? В первом название уникально, может быть, это может помочь? Или индексы в порядке? В таком случае, что я могу улучшить?

Большое спасибо

+1

Я не буду отмечать это как ответ, и я полностью уверен в различиях между SQL и mySQL с индексами, надеюсь, кто-то может помочь заполнить этот пробел для нас. Вы захотите проиндексировать свой столбец items_parent.parent, а также ваши столбцы id на элементах items_parent и на элементах. Кроме того, если вы не используете все столбцы из таблицы, вы должны вернуть только те столбцы, которые вам нужны. –

+1

ВЫБОР * необходимо? Попробуйте выбрать только один столбец для сравнения. –

ответ

1

Сначала попробуйте помещать указатель на несколько столбцов в таблицу items_parent, указав сначала родительский столбец, а затем столбец идентификатора, указанный вторым.

Кроме того, если вам не нужны все столбцы из обеих таблиц, не делайте «Select *». Как минимум здесь вы получаете дополнительный столбец из каждой таблицы для столбцов, к которым вы присоединяетесь. По сути, те же данные в 2 столбцах, что является пустой тратой времени и пропускной способностью.

+0

Первая часть не помогла, я думаю, потому что иногда я ищу по словам родителя, иногда id ... И у меня есть индекс с двумя столбцами ... Второй - спасибо за это, но никакого реального улучшения не было. – tsusanka

+0

Таблицы могут иметь несколько индексов. Я действительно думаю, что этот показатель поможет много. –

+0

Кажется, вы более чем правы. Я узнал, что большинство моих запросов arent с использованием индекса, поэтому я читаю учебник mysql, как правильно их использовать, надеюсь, это поможет. – tsusanka

3

Предлагаем Вам взглянуть на план объяснить, чтобы увидеть, если используются индексы.

+0

thx попробует это – tsusanka

+0

Спасибо за помощь, использование EXPLAIN помогло мне улучшить ключи. – tsusanka

1

Я с трудом найти хорошую статью о «покрытых индексах», но вы можете проверить это один из: http://www.mysqlperformanceblog.com/2006/11/23/covering-index-and-prefix-indexes/

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

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

+0

Но я все еще не уверен, если это проблема. Поскольку в случае, если я попробую SELECT только «items_parent.id, items_parent.parent» вместо «*», разница во времени вообще отсутствует. – tsusanka

+0

Это было :), спасибо за ваше время. – tsusanka

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