2013-06-06 8 views
3

У меня есть таблица с именем data в базе данных mysql. Стол довольно большой и имеет около 500 тыс. Записей, и это число вырастет до 1 млн. Каждая запись состоит из 50 столбцов, и большинство из них содержат varchars.Создание индекса в таблице mysql

Таблица data используется очень часто. Фактически, большинство запросов обращаются к этой таблице. Данные считываются и записываются на него примерно 50 пользователями одновременно. Система очень загружена пользователями, которые загружают и проверяют свои данные, поэтому ее можно остановить максимум на час или два.

После некоторых исследований. Я узнал, что почти все запросы на выбор, у которых есть предложение where, используют одно из четырех полей в таблице. Это поля: isActive, country, state, city - все в формате int. , Где может быть либо

where isActive = {0|1} 

или

where isActive = {0|1} and {country|state|city} = {someIntValue} 

или

where {country|state|city} = {someIntValue} 

И последняя вещь, что таблица не имеет индексов для первичного идентификатора, кроме одного.

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

Итак, на мой вопрос, если я создаю индексы на столбцах isActive, страна, штат и город увеличится производительность?

UPD: Я только что создал индекс на одном из этих полей и WOW! запросы выполняются немедленно. Спасибо вам, ребята.

+1

Да, это будет - просто попробуйте - вы не потеряете никаких данных. Вы можете использовать tinyint, когда используете значения 0 или 1. – bestprogrammerintheworld

+0

- это комплексный единый индекс для всех этих полей или отдельных для каждого поля? как я понял, создание индекса приведет к отдыху в таблице, и я не хочу рисковать. – kbeat

+1

Настольный отдых? Создание или удаление индекса не повлияет ни на какие данные, ни на таблицу. – PeteGO

ответ

2

Я не думаю, что это хорошая идея, чтобы индексировать поле isActive, потому что при добавлении/обновлении/удалении оно приведет к индексированию накладных расходов, но при чтении данных будут разделены только два куска (1 и 0) так что это не поможет.

Edit: нашел это объяснить выше точки: Is there any performance gain in indexing a boolean field?

Для других колонок дерева, я рекомендую вам сделать тест, когда большинство пользователей находятся в автономном режиме (в ночное время, или время обеда) и посмотреть, как это влияет на производительность, но я думаю, что это действительно поможет без многих недостатков.

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

+2

Может быть полезно проиндексировать 'isActive'. Если есть дисбаланс и говорят, что только 1% имеют 'isActive = 1', тогда запросы с этим условием будут использовать индекс и, вероятно, более эффективны, чем при полном сканировании таблицы. –

+0

Индекс также будет полезен для запросов типа 'WHERE isActive = X ... LIMIT (Y)' где 'X' может быть 0 или 1 и' Y' не является огромным. –

+0

После загрузки данных поле 'isActive' станет неиспользуемым из-за бизнес-логики. – kbeat

1

Да, создавая индекс на , каждый из этих столбцов поможет вам.

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

1

Да, определенно. , вы можете увидеть даже лучшие результаты, если вы также включили выбранные дополнительные поля в каждый индекс. Просто обратите внимание на порядок столбцов ... Но прежде всего, убедитесь, что вы не используете myisam-движок для большого стола со многими сообщениями! Например, переключитесь на innodb.

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