![]()  | 
		
Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 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