MySQL - JOIN BETWEEN - диапазон проверяется для каждой записи (индексная карта: 0x7) - PullRequest
0 голосов
/ 31 января 2019

В результате следующего запроса «Диапазон проверяется для каждой записи (индексная карта: 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)"
        }
    ]
}

Кто-нибудь знает, что я делаю неправильно?

...