Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Приветствую!
Есть таблица
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)
Делаю простую выборку и смотрю используется ли индекс datetime_ts
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)
Все равно индекс не использует
Почему не использует индекс? Где можно прочитать чтобы разобраться?
ПС На сайте мускула смотел, но не нашел. Также поиск в гугл не помог. Скорее всего не те фразы забиваю
Неактивен
Добавьте DETERMINISTIC к описанию функции:
Неактивен
rgbeast написал:
Добавьте DETERMINISTIC к описанию функции:
CREATE DEFINER=`yaroslav`@`%` FUNCTION `TEST_FUNC`(`ts` CHAR(20)) RETURNS char(20) CHARSET utf8 DETERMINISTIC
Иначе MySQL опасается, что функцию нужно вычислять каждый раз заново
спасибо!
Неактивен
Страниц: 1