2010-07-16 9 views
2

J'ai fonction simple consiste d'une requête SQLfonction MySql ne pas utiliser les index

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 

Temps d'exécution de cette fonction prend 5 secondes

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

Temps d'exécution de la requête simple Takes 0,001 secondes

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

Le champ "Titre" est indexé. Pourquoi l'exécution de fonction prend tellement de temps et comment puis-je l'optimiser?

modifier: Plan d'exécution

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) 
+0

peut vous inclure le plan d'exécution? – MJB

Répondre

2

Cela pourrait être un problème de jeu de caractères. Si la fonction utilise un jeu de caractères différent de celui de la colonne de la table, cela entraînerait une performance très lente malgré l'index. Exécutez show create table products\G pour déterminer le jeu de caractères de la colonne.

Exécutez show variables like 'character_set%'; pour connaître les jeux de caractères par défaut pertinents pour votre base de données.

+0

Brillant. Comment forcer la procédure à utiliser le jeu de caractères correct. –

+0

Vous pouvez spécifier un jeu de caractères pour le paramètre d'entrée. Par exemple 'CREATE FUNCTION GetProductIDFunc (in_title char (14) jeu de caractères utf8) ...' –

+0

Une autre option consiste à convertir explicitement le jeu de caractères de in_title en le comparant au titre: 'select id dans out_id des produits où title = convert (in_title using utf8) limite 1; ' –

0

Essayez ceci:

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 
+0

Rien n'a changé. –