Отказывается использовать индекс в поле TIMESTAMP - PullRequest
0 голосов
/ 25 февраля 2019

Не могу понять, почему один и тот же запрос в одном поле использует индекс, а не в другом.Оба поля имеют индекс.Одно поле - INT, а другое - TIMESTAMP.Какая-то магияСправка!

Это таблица:

    CREATE TABLE `fb_posts` (
    `postID` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `url` VARCHAR(255) NOT NULL,
    `time` INT(11) NOT NULL,
    `partnerID` INT(11) NOT NULL,
    `aTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`postID`),
    INDEX `time` (`time`),
    INDEX `aTime` (`aTime`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPRESSED
AUTO_INCREMENT=67640377;

Объяснение запросов:

1.

mysql>       explain SELECT
    ->                 `fb_posts`.`partnerID`
    ->             FROM
    ->                 `fb_posts`
    ->             WHERE
    ->                 `fb_posts`.`time` > 1551107400
    ->                 AND `fb_posts`.`time` <= 1551108000
    ->                 
    ->         ;
+----+-------------+----------+-------+---------------+------+---------+------+------+-----------------------+
| id | select_type | table    | type  | possible_keys | key  | key_len | ref  | rows | Extra                 |
+----+-------------+----------+-------+---------------+------+---------+------+------+-----------------------+
|  1 | SIMPLE      | fb_posts | range | time          | time | 4       | NULL |    1 | Using index condition |
+----+-------------+----------+-------+---------------+------+---------+------+------+-----------------------+
1 row in set (0.00 sec)

2.

mysql>       explain SELECT
    ->                 `fb_posts`.`partnerID`
    ->             FROM
    ->                 `fb_posts`
    ->             WHERE
    ->                 `fb_posts`.`aTime` > 1551107400
    ->                 AND `fb_posts`.`aTime` <= 1551108000
    -> ;
+----+-------------+----------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows     | Extra       |
+----+-------------+----------+------+---------------+------+---------+------+----------+-------------+
|  1 | SIMPLE      | fb_posts | ALL  | aTime         | NULL | NULL    | NULL | 69567867 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+----------+-------------+
1 row in set, 4 warnings (0.00 sec)

ПОЧЕМУ ???

1 Ответ

0 голосов
/ 25 февраля 2019

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

Попробуйте просмотреть статистику и прочитайте руководство «ПРОЦЕДУРА АНАЛИЗА ()»

SELECT * FROM `fb_posts` PROCEDURE ANALYSE();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...