Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
CREATE TABLE `t1` (
`k1` int(10) unsigned NOT NULL DEFAULT '0',
`k2` int(10) unsigned NOT NULL DEFAULT '0',
`i1` int(10) unsigned NOT NULL DEFAULT '0',
`i2` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`k1`,`k2`),
KEY `secondary_index` (`i1`,`i2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 (`i1`,`i2`, `k1`, `k2`) где первая пара полей (i) используется для поиска второй (k). Когда получена вторая пара (k, образующая первичный ключ), по ней ищутся строки в таблице данных.mysql> SELECT * FROM `t1`;
+-----+-----+-----+-----+
| k1 | k2 | i1 | i2 |
+-----+-----+-----+-----+
| 251 | 762 | 60 | 13 |
| 786 | 490 | 92 | 988 |
| 885 | 385 | 272 | 202 |
| 159 | 403 | 537 | 480 |
| 624 | 341 | 830 | 130 |
| 667 | 372 | 856 | 163 |
+-----+-----+-----+-----+
6 rows in set (0.00 sec)
mysql> EXPLAIN SELECT * FROM `t1` WHERE `i1` > 200 AND `i2` < 200\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: range
possible_keys: secondary_index
key: secondary_index
key_len: 4
ref: NULL
rows: 4
Extra: Using where; Using index
ALTER TABLE `t1` DROP PRIMARY KEY;
ALTER TABLE `t1` ADD PRIMARY KEY (`k1`);
mysql> EXPLAIN SELECT * FROM `t1` WHERE `i1` > 200 AND `i2` < 200\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: ALL
possible_keys: secondary_index
key: NULL
key_len: NULL
ref: NULL
rows: 6
Extra: Using where
mysql> EXPLAIN SELECT `k1`, `i1`, `i2` FROM `t1` WHERE `i1` > 200 AND `i2` < 200\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: range
possible_keys: secondary_index
key: secondary_index
key_len: 4
ref: NULL
rows: 4
Extra: Using where; Using index
CREATE TABLE `t1_isam` (
`k1` int(10) unsigned NOT NULL DEFAULT '0',
`k2` int(10) unsigned NOT NULL DEFAULT '0',
`i1` int(10) unsigned NOT NULL DEFAULT '0',
`i2` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`k1`,`k2`),
KEY `secondary_index` (`i1`,`i2`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1mysql> SELECT * FROM `t1_isam`;
+-----+-----+-----+-----+
| k1 | k2 | i1 | i2 |
+-----+-----+-----+-----+
| 233 | 203 | 315 | 964 |
| 875 | 485 | 801 | 549 |
| 341 | 58 | 267 | 163 |
| 13 | 574 | 833 | 444 |
| 719 | 262 | 152 | 977 |
| 426 | 201 | 726 | 27 |
+-----+-----+-----+-----+
6 rows in set (0.00 sec)
mysql> EXPLAIN SELECT * FROM `t1_isam` WHERE `i1` > 200 AND `i2` < 200\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1_isam
type: ALL
possible_keys: secondary_index
key: NULL
key_len: NULL
ref: NULL
rows: 6
Extra: Using wheremysql> EXPLAIN SELECT `i1`, `i2` FROM `t1_isam` WHERE `i1` > 200 AND `i2` < 200\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1_isam
type: range
possible_keys: secondary_index
key: secondary_index
key_len: 4
ref: NULL
rows: 5
Extra: Using where; Using index
в индексах отсутствуют дублирующиеся строки
позволяют использовать алгоритм бинарного поиска
В-четвёртых, данные в индексе отсортированы.
скажите, а где можно почитать про кросс-ссылки между нодами B-Tree?
If the table has no PRIMARY KEY or suitable UNIQUE index, InnoDB internally generates a hidden clustered index on a synthetic column containing row ID values. The rows are ordered by the ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order.
Наверное, это очень затратно при изменении индекса
Thus, the rows ordered by the row ID are physically in insertion order.Это переводится так: «Таким образом, строки, отсортированные по ID, физически [хранятся] в том порядке, в котором они записывались в таблицу».
При добавлении в середину таблицы точно так же произойдёт разделение заполненной страницы пополам и в одну из этих половинок добавятся новые данные и получим в середине данных две наполовину заполненные страницы, остальные страницы никакого действия над собой не увидят
The leaves (the bottom-most index blocks) of the B+ tree are often linked to one another in a linked list; this makes range queries or an (ordered) iteration through the blocks simpler and more efficient (though the aforementioned upper bound can be achieved even without this addition).
Кластерные и «обычные» индексы MySQL (InnoDB)