Индексирование всех Vs. Индексирование некоторых - PullRequest
0 голосов
/ 25 июня 2011

Я читал этот вопрос MySQL - почему бы не индексировать каждое поле? и решил провести несколько тестов.

Наличие двух эквивалентных таблиц (a и b), в каждой из которых по 5.000.000 строк и 3 столбца (int, int, varchar), я проиндексировал все столбцы в таблице b и просто проиндексировал один столбец (первичный ключ) в таблице a.

Результаты были следующими:

Изменить: время такое же, как показано ниже для строк, измененных / неизмененных.

mysql> update a set c = '1000000' where c = '1000000';
Query OK, 0 rows affected (2.13 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> update b set c = '1000000' where c = '1000000';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

Теперь это полностью противоположно тому, что я ожидал после прочтения ответов на вопрос.

Есть ли какой-либо «эталонный» недостаток, заключающийся в отсутствии индексации каждого столбца таблицы?


Правка: проблема заключалась в том, что каждый кортеж в таблице имел уникальное значение, и обновление одной индексированной и уникальной строки былодостаточно быстро, чтобы получить 0,00 балла.Однако когда я обновлял подмножества строк, такие как указанные Flimzy и Searlea, обновление неиндексированных столбцов происходило быстрее, чем обновление индексированных столбцов, как и должно быть.

Результаты, если вы хотите их увидеть:

mysql> update a set b = 98;
Query OK, 5000002 rows affected (10.85 sec)
Rows matched: 5000002  Changed: 5000002  Warnings: 0

mysql> update b set b = 98;
Query OK, 4988890 rows affected (1 min 32.69 sec)
Rows matched: 5000001  Changed: 4988890  Warnings: 0

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Конечно, есть недостатки для индексации каждого столбца. При большем количестве индексов запись (INSERT, UPDATE и DELETE) занимает больше времени, поскольку в базу данных записывается больше вещей.

Индексы могут ускорить процесс только для чтения . Значение, ВЫБРАТЬ, УДАЛИТЬ ... ГДЕ и ОБНОВИТЬ ... ГДЕ.

1 голос
/ 25 июня 2011

Я предполагаю, что обе таблицы содержат столбцы с именами a, b и c, и все они числовые (хотя c является строковым.) Предполагая, что a является вашим столбцом первичного ключа, это должно показать значительную разницу, так как оба обновлениявыиграть от возможности находить затронутые строки, в то время как таблица b должна принять удар, когда она должна обновить индекс:

update a set b = b + 1 where a between 100000 and 200000;
update b set b = b + 1 where a between 100000 and 200000;

Или, в общих чертах:

update sane set col2 = col2 + 1 where pk between X and Y;

должен работать лучше чем:

update fullindexed set col2 = col2 + 1 where pk between X and Y;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...