Почему количество элементов индекса в MySQL остается неизменным, когда я добавляю новый индекс? - PullRequest
8 голосов
/ 16 апреля 2009

Я добавил индекс FULLTEXT в одну из моих таблиц базы данных MySQL следующим образом:

ALTER TABLE members ADD FULLTEXT(about,fname,lname,job_title);

Проблема в том, что при использовании phpmyadmin я вижу, что мощность моего нового индекса составляет всего 1 . Означает ли это, что индекс никогда не будет использоваться?

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

analyze table members

Соответствующими типами полей индекса являются varchar (100), varchar (100), text, varchar (200), а используемый движок - MyISAM, а таблица содержит около 30 000 строк, все уникальные. Моя версия MySQL 5.0.45.

Я что-то не так делаю?

Ответы [ 2 ]

13 голосов
/ 16 апреля 2009

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

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

Вот как это работает: когда вы строите индекс по набору столбцов (a,b,c,d), тогда база данных проходит по всем строкам таблицы, просматривая упорядоченные четверки этих 4 столбцов для каждой строки. Допустим, ваш стол выглядит так:

a  b  c  d  e   
-- -- -- -- --  
1  1  1  1  200 
1  1  1  1  300
1  2  1  1  200
1  3  1  1  200

Итак, на что смотрит база данных, это только 4 столбца (a, b, c, d):

a  b  c  d  
-- -- -- --
1  1  1  1 
1  2  1  1 
1  3  1  1 

Видите, что осталось только 3 уникальных строки? Они станут нашими ведрами, но мы вернемся к этому. В действительности есть также идентификатор записи или идентификатор строки для каждой строки в таблице. Итак, наш оригинальный стол выглядит так:

(row id) a  b  c  d  e   
-------- -- -- -- -- --  
00000001 1  1  1  1  200 
00000002 1  1  1  1  300
00000003 1  2  1  1  200
00000004 1  3  1  1  200

Поэтому, когда мы смотрим только на 4 столбца (a, b, c, d), мы действительно смотрим также на идентификатор строки:

(row id) a  b  c  d 
-------- -- -- -- --
00000001 1  1  1  1
00000002 1  1  1  1
00000003 1  2  1  1
00000004 1  3  1  1

Но мы хотим выполнить поиск по (a, b, c, d), а не по идентификатору строки, поэтому мы производим что-то вроде этого:

(a,b,c,d) (row id)
--------- --------
1,1,1,1   00000001
1,1,1,1   00000002
1,2,1,1   00000003
1,3,1,1   00000004

И, наконец, мы группируем все идентификаторы строк с одинаковыми значениями (a, b, c, d):

(a,b,c,d) (row id)
--------- ---------------------
1,1,1,1   00000001 and 00000002
1,2,1,1   00000003
1,3,1,1   00000004

Видите это? Значения (a, b, c, d), которые являются (1,1,1,1) (1,2,1,1) и (1,3,1,1), стали ключами для нашей справочной таблицы в строки исходной таблицы.

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

Но суть в следующем: количество элементов просто измеряет количество уникальных строк в индексе. И в нашем примере это было количество ключей в нашей таблице поиска, которое было 3.

Надеюсь, это поможет!

11 голосов
/ 16 апреля 2009

Я не могу однозначно ответить, почему MySQL не вычисляет мощность, но я могу догадаться. Руководство MySQL гласит:

Количество элементов: оценка количества уникальных значений в индексе. Это обновляется при запуске ANALYZE TABLE или myisamchk -a. Количество элементов рассчитывается на основе статистики, хранящейся в виде целых чисел, поэтому значение не обязательно является точным даже для небольших таблиц. Чем выше количество элементов, тем больше вероятность того, что MySQL использует индекс при выполнении соединений.

Индексы FULLTEXT используются только в запросах MATCH ... AGAINST (...), что вызывает использование индекса. Синтаксис MATCH ... AGAINST не работает, если в этих полях нет индекса FULLTEXT.

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

Обратите внимание, что поиск по индексу работает, даже если количество элементов не установлено.

Для справки: оператор foobar ANALYZE TABLE, похоже, правильно устанавливает количество элементов.

...