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

Ярослав

Новичок
Приветствую!

Есть таблица
Код:
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)
Все равно индекс не использует
Почему не использует индекс? Где можно прочитать чтобы разобраться?
ПС На сайте мускула смотел, но не нашел. Также поиск в гугл не помог. Скорее всего не те фразы забиваю
 

Ярослав

Новичок
Посоветуйте плиз еще форум по SQL, MYSQL. Знаю только sql.ru
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
можно было бы просто сказать ключевое слово DETERMINISTIC, но нет - надо выпендриться! :)
 

Фанат

oncle terrible
Команда форума
мне кажется что это тот случай, когда мало данных в таблице.

а функция должна быть не при чем - она же в константной части
 

Redjik

Джедай-мастер
@Фанат, нет это же логично, функция может выдавать как одинаковое значение для строки, так и разное, поэтому по дефолту индексы отрубаются.
А вот DETERMINISTIC указывает, что значения функции для строки всегда одинаковые и индексы начинают учитываться

PHP:
// non-deterministic
if ($val > rand(1, 5)){}

//deterministic
if ($val > pow(2, 2)){}
 
Последнее редактирование:
Сверху