MySQL索引在存储过程中不起作用

时间:2014-08-12 02:33:11

标签: mysql stored-procedures

我有一张车辆信息表,想要通过vin搜索。

为表格创建声明:

CREATE TABLE `vehicles` (
  `vehicle_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `vehicle_year` smallint(6) NOT NULL,
  `vehicle_make` varchar(20) NOT NULL,
  `vehicle_model` varchar(50) NOT NULL,
  `vehicle_style` varchar(50) NOT NULL,
  `vehicle_vin` varchar(17) NOT NULL,
  `col_symbol` tinyint(3) unsigned NOT NULL,
  `comp_symbol` tinyint(3) unsigned NOT NULL,
  `current_value` double DEFAULT NULL,
  `unacceptable` tinyint(4) DEFAULT '0',
PRIMARY KEY (`vehicle_id`),
UNIQUE KEY `vehicle_unique_idx` (`vehicle_year`,`vehicle_make`,`vehicle_model`,`vehicle_style`,`vehicle_vin`,`col_symbol`,`comp_symbol`),
KEY `vehicle_vin_idx` (`vehicle_vin`)
) ENGINE=InnoDB AUTO_INCREMENT=162591 DEFAULT CHARSET=latin1;

我的问题是,在存储过程中通过vin搜索时似乎没有使用索引。

存储过程的定义:

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_vehicle`(v_vin VARCHAR(17))
BEGIN

EXPLAIN SELECT
    vehicle_year,
    vehicle_make,
    vehicle_model,
    vehicle_style,
    vehicle_vin,
    col_symbol,
    comp_symbol,
    current_value,
    unacceptable,
    (1000 + (comp_symbol * .0001)) AS score
FROM
    vehicles
WHERE
    vehicle_vin = v_vin;

END

当我致电CALL get_vehicle('1ZVBP8EM*E');时,我得到以下输出:

  

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra

     

'1','SIMPLE','车辆','ALL',NULL,NULL,NULL,NULL,'66583','使用位置'

所以它没有使用索引。但是,当我在过程之外运行查询时,它使用vin索引。

查询:

EXPLAIN SELECT
    vehicle_year,
    vehicle_make,
    vehicle_model,
    vehicle_style,
    vehicle_vin,
    col_symbol,
    comp_symbol,
    current_value,
    unacceptable,
    (1000 + (comp_symbol * .0001)) AS score
FROM
    vehicles
WHERE
    vehicle_vin = '1ZVBP8EM*E';

返回以下内容:

  

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra

     

1,SIMPLE,vehicles,ref,vehicle_vin_idx,vehicle_vin_idx,19,const,1,使用索引条件

为什么它不会在存储过程中使用索引但它在存储过程之外?如何让它在程序中使用索引?

更新

所以我尝试删除索引并替换它们但仍然没有运气。我也尝试使用新名称和新索引名称创建表,但仍然没有运气。每次,在程序中,它不使用索引,但在它之外,它确实。

非常感谢任何帮助。谢谢!

更新#2

所以我再次删除了表并从头创建了表和一个新程序,现在它在两个地方都可以工作。我原来的程序现在也有效。它一定是原始表格的东西。

0 个答案:

没有答案