Ярослав
Новичок
Приветствую!
Есть таблица
Делаю простую выборку и смотрю используется ли индекс datetime_ts
Все ок. Далее добавляю функцию
Пробуем сделать выборку и использовать функцию
Индекс не использует
Пробую указать принудительно
Все равно индекс не использует
Почему не использует индекс? Где можно прочитать чтобы разобраться?
ПС На сайте мускула смотел, но не нашел. Также поиск в гугл не помог. Скорее всего не те фразы забиваю
Есть таблица
Код:
mysql> show create table `index-test`\G
*************************** 1. row ***************************
Table: index-test
Create Table: CREATE TABLE `index-test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`datetime_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `datetime_ts` (`datetime_ts`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Код:
mysql> EXPLAIN SELECT *
-> FROM `index-test`
-> WHERE datetime_ts > now( );
+----+-------------+------------+-------+---------------+-------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------+-------------+---------+------+------+-------------+
| 1 | SIMPLE | index-test | range | datetime_ts | datetime_ts | 4 | NULL | 1 | Using where |
+----+-------------+------------+-------+---------------+-------------+---------+------+------+-------------+
1 row in set (0.00 sec)
Код:
DROP FUNCTION `TEST_FUNC`//
CREATE DEFINER=`yaroslav`@`%` FUNCTION `TEST_FUNC`(`ts` CHAR(20)) RETURNS char(20) CHARSET utf8
BEGIN
RETURN `ts`;
END
Код:
mysql> EXPLAIN SELECT * FROM `index-test` WHERE datetime_ts > TEST_FUNC(NOW());
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | index-test | ALL | NULL | NULL | NULL | NULL | 5 | Using where |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
Пробую указать принудительно
Код:
mysql> EXPLAIN SELECT * FROM `index-test` FORCE INDEX(datetime_ts) WHERE datetime_ts > TEST_FUNC(NOW());
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | index-test | ALL | NULL | NULL | NULL | NULL | 5 | Using where |
+----+-------------+------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
Почему не использует индекс? Где можно прочитать чтобы разобраться?
ПС На сайте мускула смотел, но не нашел. Также поиск в гугл не помог. Скорее всего не те фразы забиваю