我有一张车辆信息表,想要通过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
所以我再次删除了表并从头创建了表和一个新程序,现在它在两个地方都可以工作。我原来的程序现在也有效。它一定是原始表格的东西。