powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объясните, как задействован составной индекс
7 сообщений из 7, страница 1 из 1
Объясните, как задействован составной индекс
    #38648135
Pilsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опять мои пробелы в матбазе..

Есть таблица:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
mysql> show fields from table_contacts;
+-------------+------------------------------+------+-----+---------+----------------+
| Field       | Type                         | Null | Key | Default | Extra          |
+-------------+------------------------------+------+-----+---------+----------------+
| id          | int(9) unsigned              | NO   | MUL | NULL    |                |
| type        | enum('admin','tech','owner') | YES  |     | NULL    |                |
| email       | int(9) unsigned              | NO   | MUL | NULL    |                |
| email_ind   | int(9) unsigned              | NO   |     | NULL    |                |
| cid         | int(9) unsigned              | NO   | PRI | NULL    | auto_increment |
+-------------+------------------------------+------+-----+---------+----------------+ 



В ней есть такие индексы:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
mysql> show index from table_contacts;
+---------------+------------+-----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table         | Non_unique | Key_name              | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+-----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| boar_contacts |          0 | PRIMARY               |            1 | cid         | A         |   138733269 |     NULL | NULL   |      | BTREE      |         |               |
| boar_contacts |          1 | index_email_email_ind |            1 | email       | A         |    69366634 |     NULL | NULL   |      | BTREE      |         |               |
| boar_contacts |          1 | index_email_email_ind |            2 | email_ind   | A         |   138733269 |     NULL | NULL   |      | BTREE      |         |               |
+---------------+------------+-----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+



обращу внимание - cid = primary key.

теперь выполняется запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
mysql> select min(cid) from table_contacts where email=688 and email_ind=0;
+-----------+
| min(cid)  |
+-----------+
| 609263682 |
+-----------+
1 row in set (0.73 sec) 



мы знаем, что составной индекс (email, email_ind) аналогичен индексу (email,email_ind,cid)
если так - почему же так долго выполняется запрос.. почему он перебирает значения cid, а не берет их из индекса? cid ведь третье поле, первые 2 заданы в условии.

подскажите, чего я не знаю.
...
Рейтинг: 0 / 0
Объясните, как задействован составной индекс
    #38648165
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pilsen ,

а план выполнения что показывает? сканирование или использование индекса?
...
Рейтинг: 0 / 0
Объясните, как задействован составной индекс
    #38648182
Pilsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
mysql> explain select min(cid) from table_contacts_tmp where email=688 and email_ind=0;
+----+-------------+-------------------+------+-----------------------+-----------------------+---------+-------------+-------+-------------+
| id | select_type | table             | type | possible_keys         | key                   | key_len | ref         | rows  | Extra       |
+----+-------------+-------------------+------+-----------------------+-----------------------+---------+-------------+-------+-------------+
|  1 | SIMPLE      | table_contacts_tmp | ref  | index_email_email_ind | index_email_email_ind | 8       | const,const | 60542 | Using index |
+----+-------------+-------------------+------+-----------------------+-----------------------+---------+-------------+-------+-------------+
1 row in set (0.13 sec)
...
Рейтинг: 0 / 0
Объясните, как задействован составной индекс
    #38648233
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pilsen
Код: sql
1.
2.
3.
4.
5.
6.
7.
mysql> explain select min(cid) from table_contacts_tmp where email=688 and email_ind=0;
+----+-------------+-------------------+------+-----------------------+-----------------------+---------+-------------+-------+-------------+
| id | select_type | table             | type | possible_keys         | key                   | key_len | ref         | rows  | Extra       |
+----+-------------+-------------------+------+-----------------------+-----------------------+---------+-------------+-------+-------------+
|  1 | SIMPLE      | table_contacts_tmp| ref  | index_email_email_ind | index_email_email_ind | 8       | const,const | 60542 | Using index |
+----+-------------+-------------------+------+-----------------------+-----------------------+---------+-------------+-------+-------------+
1 row in set (0.13 sec)

ну и где сканирование таблицы? индекс на 100% работает.

Почему долго (и долго ли) - другой вопрос...
...
Рейтинг: 0 / 0
Объясните, как задействован составной индекс
    #38648635
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

он имел ввиду, почему мин примари кей не выбирает сразу.
ну типо наш индекс это индекс по двум полям, у нас есть оба значения, поэтому индекс находит нужную ветку, на а так как нам нужен минимум ПК, то почему оно сканирует все записи этой ветки, а не сразу берёт первую, ведь имено там будет минимальный первичный ключ.
...
Рейтинг: 0 / 0
Объясните, как задействован составной индекс
    #38648685
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из http://sqlfiddle.com/#!2/669ce/1 могу предположить, что для индекса из двух полей (без ID) дополнительная сортировка по ID не выполняется.
А значит, для получения min(id) необходимо из индекса извлечь все требуемые строки (a,b,id), и среди них вычислить минимальный id

Индекс из трех полей, несмотря на избыточность, дополнительно выполняет (явно затребованную) сортировку по id.
Из-за этого план выполнения для второго варианта - мне не понятен
...
Рейтинг: 0 / 0
Объясните, как задействован составной индекс
    #38648966
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007из http://sqlfiddle.com/#!2/669ce/1 могу предположить, что для индекса из двух полей (без ID) дополнительная сортировка по ID не выполняется.
А значит, для получения min(id) необходимо из индекса извлечь все требуемые строки (a,b,id), и среди них вычислить минимальный id

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


Select tables optimized away
Это означает что для выполнения запроса не нужно заглядывать в данные ни одной таблицы...и действительно, данные ответа получаються из чтения только индекса.

и кажись я понял что там с двойным.
для узла в дереве индекса, там ведь перечислены первичные ключи, но не отсортировано...а по мере добавления. поэтому чтоб найти минимум, надо так сортировать.
(последний абзац для автора)
тоесть index(f1,f2,PK) <> index(f1,f2)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объясните, как задействован составной индекс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]