Функция MySql не использует индексы - PullRequest
2 голосов
/ 16 июля 2010

У меня есть простая функция, состоящая из одного SQL-запроса

CREATE FUNCTION `GetProductIDFunc`( in_title char (14) )
        RETURNS bigint(20)
BEGIN
  declare out_id bigint;    

  select id into out_id from products where title = in_title limit 1;    
  RETURN out_id;
END

Время выполнения этой функции составляет 5 секунд

select Benchmark(500 ,GetProductIdFunc('sample_product'));

Время выполнения простого запроса составляет 0,001 секунды

select Benchmark(500,(select id from products where title = 'sample_product' limit 1));

Поле «Заголовок» проиндексировано. Почему выполнение функции занимает так много времени и как я могу ее оптимизировать?

редактирование: План выполнения

mysql> EXPLAIN EXTENDED select id from products where title = 'sample_product' limit 1;
+----+-------------+----------+-------+---------------+------------+---------+-------+------+----------+-------------+
| id | select_type | table    | type  | possible_keys | key        | key_len | ref   | rows | filtered | Extra       |
+----+-------------+----------+-------+---------------+------------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | products | const | Index_title   | Index_title | 14      | const |    1 |   100.00 | Using index |
+----+-------------+----------+-------+---------------+------------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> EXPLAIN select GetProductIdFunc('sample_product');
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | No tables used |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

Ответы [ 2 ]

2 голосов
/ 16 июля 2010

Это может быть проблема с набором символов.Если функция использует набор символов, отличный от столбца таблицы, это может привести к очень низкой производительности, несмотря на индекс.

Выполнить show create table products\G для определения набора символов для столбца.

Запустите show variables like 'character_set%';, чтобы увидеть, какие соответствующие наборы символов по умолчанию используются для вашей БД.

0 голосов
/ 16 июля 2010

Попробуйте это:

CREATE FUNCTION `GetProductIDFunc`( in_title char (14) )
        RETURNS bigint(20)
BEGIN
  declare out_id bigint;    

  set out_id = (select id from products where title = in_title limit 1);    
  RETURN out_id;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...