代码之家  ›  专栏  ›  技术社区  ›  Denis Palnitsky

mysql函数不使用索引

  •  2
  • Denis Palnitsky  · 技术社区  · 14 年前

    我有一个由一个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 回复  |  直到 14 年前
        1
  •  2
  •   Ike Walker    14 年前

    这可能是字符集问题。如果函数使用的字符集与表列的字符集不同,则尽管索引不同,但会导致性能非常慢。

    show create table products\G 确定列的字符集。

    show variables like 'character_set%'; 查看数据库的相关默认字符集。

        2
  •  0
  •   ceteras    14 年前

    试试这个:

    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