Задавайте вопросы, мы ответим
Вы не зашли.
извеняюсь, если постотряюсь, но вроде бы не нашел темы по моему вопросу.
не понятен алгоритм сравнения строк при использовании усеченного индекса по текстовому полю, к примеру есть таблица test с полем name (varchar(10)) следующего содержания
stat
stam
stol
sietl
строю индекс
alter table test add key name(name(2));
далее делаю выборку
select name from test use index(name) where name='stat'
получаю вывод:
stat
я всегда думал, что при использовании усеченного индекса сравниваться строки будут на размер индекса, не больше, и в таком варианте вывод у нас должен быть:
stat
stam
stol
т.е. не понятно как идет дальше сравнение со строкой, в данном случае, после первых двух символов.
Неактивен
не понятно как идет дальше сравнение со строкой, в данном случае, после первых двух символов.
Критерии сравнения данных никак не зависят от индексов.
От индексов зависит лишь то, откуда MySQL будет брать данные - из индексов или из данных - от этого зачастую зависит скорость запроса, т.к., грубо говоря, индексы в памяти, а данные на диске.
Усеченный индекс есть, по сути, индексация не всей колонки, а первых n символов - чтобы индекс на текстовых полях сильно не разрастался.
Неактивен
видать я дейтсвительно что-то недопонимаю в основах, поправте меня, пожалуйста, если я ошибаюсь:
1.к MySQL поступает запрос на выборку, он проверяет возможно ли эту выборку сделать по индексу, находит что выбрать можно по индексу name(2), далее идет поиск строки по условию в Б дереве: сначала ищется вхождение в Б дерево первого символа, затем в поддереве находится второй символ, таким образом мы доходим до конечного узла, выборку полностью из этого индкеса сделать нельзя, так как проидексированы только две буквы, но у нас есть указатели, на места в фале БД где хранятся строки начинающиеся на 'st' и этих строк, как и указтелей, три штуки
2. тут что то происходит мне не понятное, но, по логике, должна просто делается выборка по этим трем строкам.
первую часть моих выклодок подтверждает и explain, говоря что нашел 3 строки по запросу select name from test use index(name) where name='stat';
mysql> select name from test use index(name); +---------+ | name | +---------+ | masha | | mashina | | mel | | muka | | marusia | | mama | | stat | | stam | | stol | | sietl | +---------+ 10 rows in set (0.00 sec) mysql> SHOW INDEX FROM test; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | test | 1 | name | 1 | name | A | NULL | 2 | NULL | | BTREE | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 1 row in set (0.00 sec) mysql> explain select name from test use index(name) where name='stat'; +----+-------------+-------+------+---------------+------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+-------+------+-------------+ | 1 | SIMPLE | test | ref | name | name | 2 | const | 3 | Using where | +----+-------------+-------+------+---------------+------+---------+-------+------+-------------+ 1 row in set (0.01 sec)
Неактивен
2. здесь, так как индекс недостаточен, MySQL производит сравнение самих строк (это 3 строки, найденные по индексу). Так же было бы, если бы Вы добавили к условию AND age>100. Если хотите только по двум символам сравнивать, то where name like 'st%'.
Очень важное правило - результат запроса не зависит от наличия и типа индексов.
Неактивен
да про like понятно и я помню, что если выражение начинается не с % то like использует индекс.
т.е. в данном случае мы с помощью индекса нашли первые два символа, а дальше идет простой перебор?
Неактивен