SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.12.2015 01:33:13

kiotoze
Участник
Зарегистрирован: 08.12.2015
Сообщений: 2

Не подхватывает индекс при использовании функций

Приветствую!

Есть таблица

Код:

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)

Все равно индекс не использует
Почему не использует индекс? Где можно прочитать чтобы разобраться?
ПС На сайте мускула смотел, но не нашел. Также поиск в гугл не помог. Скорее всего не те фразы забиваю

Неактивен

 

#2 08.12.2015 16:45:20

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Не подхватывает индекс при использовании функций

Добавьте DETERMINISTIC к описанию функции:

CREATE DEFINER=`yaroslav`@`%` FUNCTION `TEST_FUNC`(`ts` CHAR(20)) RETURNS char(20) CHARSET utf8 DETERMINISTIC


Иначе MySQL опасается, что функцию нужно вычислять каждый раз заново

Неактивен

 

#3 08.12.2015 16:49:07

kiotoze
Участник
Зарегистрирован: 08.12.2015
Сообщений: 2

Re: Не подхватывает индекс при использовании функций

rgbeast написал:

Добавьте DETERMINISTIC к описанию функции:

CREATE DEFINER=`yaroslav`@`%` FUNCTION `TEST_FUNC`(`ts` CHAR(20)) RETURNS char(20) CHARSET utf8 DETERMINISTIC


Иначе MySQL опасается, что функцию нужно вычислять каждый раз заново

спасибо!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson