SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.05.2008 03:16:39

561
Участник
Зарегистрирован: 28.05.2008
Сообщений: 3

усеченные индексы

извеняюсь, если постотряюсь, но вроде бы не нашел темы по моему вопросу.

не понятен алгоритм сравнения строк при использовании усеченного индекса по текстовому полю, к примеру есть таблица 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

т.е. не понятно как идет дальше сравнение со строкой, в данном случае, после первых двух символов.

Неактивен

 

#2 28.05.2008 05:44:49

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: усеченные индексы

не понятно как идет дальше сравнение со строкой, в данном случае, после первых двух символов.

Критерии сравнения данных никак не зависят от индексов.
От индексов зависит лишь то, откуда MySQL будет брать данные - из индексов или из данных - от этого зачастую зависит скорость запроса, т.к., грубо говоря, индексы в памяти, а данные на диске.
Усеченный индекс есть, по сути, индексация не всей колонки, а первых n символов - чтобы индекс на текстовых полях сильно не разрастался.

Неактивен

 

#3 28.05.2008 10:41:28

561
Участник
Зарегистрирован: 28.05.2008
Сообщений: 3

Re: усеченные индексы

видать я дейтсвительно что-то недопонимаю в основах, поправте меня, пожалуйста, если я ошибаюсь:

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)

Неактивен

 

#4 28.05.2008 18:22:57

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: усеченные индексы

2. здесь, так как индекс недостаточен, MySQL производит сравнение самих строк (это 3 строки, найденные по индексу). Так же было бы, если бы Вы добавили к условию AND age>100. Если хотите только по двум символам сравнивать, то where name like 'st%'.

Очень важное правило - результат запроса не зависит от наличия и типа индексов.

Неактивен

 

#5 28.05.2008 19:55:48

561
Участник
Зарегистрирован: 28.05.2008
Сообщений: 3

Re: усеченные индексы

да про like понятно и я помню, что если выражение начинается не с % то like использует индекс.

т.е. в данном случае мы с помощью индекса нашли первые два символа, а дальше идет простой перебор?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson