В результате следующего запроса «Диапазон проверяется для каждой записи (индексная карта: 0x7)».Я ожидаю, потому что есть левый + правый индекс, он будет использовать этот индекс.Я уже нашел в статье Проверка диапазона Mysql вместо использования индекса при внутреннем объединении , но эта таблица использует свою собственную структуру, поэтому точно такие же типы столбцов.Я использую MySQL 5.7.
DROP TABLE IF EXISTS test.tree;
CREATE TABLE test.tree (
lft INT(10) UNSIGNED NOT NULL,
rght INT(10) UNSIGNED NOT NULL,
INDEX ix_left_right (lft, rght),
INDEX ix_left (lft),
INDEX ix_right (rght)
);
EXPLAIN
SELECT X.*
FROM test.tree X
LEFT JOIN test.tree Y ON X.lft BETWEEN Y.lft AND Y.rght;
Результат
{
"table": "UnknownTable",
"rows":
[
{
"id": 1,
"select_type": "SIMPLE",
"table": "X",
"partitions": null,
"type": "index",
"possible_keys": null,
"key": "ix_left_right",
"key_len": "8",
"ref": null,
"rows": 1,
"filtered": 100.00,
"Extra": "Using index"
},
{
"id": 1,
"select_type": "SIMPLE",
"table": "Y",
"partitions": null,
"type": "ALL",
"possible_keys": "ix_left_right,ix_left,ix_right",
"key": null,
"key_len": null,
"ref": null,
"rows": 1,
"filtered": 100.00,
"Extra": "Range checked for each record (index map: 0x7)"
}
]
}
Кто-нибудь знает, что я делаю неправильно?