数据不匹配开销

如果在某一条件下使用的列的数据类型与 CREATE TABLE 语句中的列的定义不同,那么 SQL 语句可能会遇到额外的成本。

例如:以下查询包含一个条件,该条件将一列与不同于表定义的数据类型值进行比较:
CREATE TABLE table1 (a integer, );
SELECT * FROM table1 
      WHERE a = '123';

在执行将 123 转换成整数之前,数据库服务器重写该查询。SET EXPLAIN 输出按其调整的格式显示查询。该数据转换没有显著的开销。

当查询将一个字符列与一个非字符值进行比较,并且数字长度不等于字符列的长度时,数据不匹配所导致的额外成本是最严重的。例如:以下查询在 WHERE 子句中包含一个条件,由于缺少引号导致了一个字符列等于一个整数值:
CREATE TABLE table2 (char_col char(3), );
SELECT * FROM table2 
      WHERE char_col = 1;
该查询查找对 char_col 有效的下列所有的值:
' 1'
'001'
'1'
这些值不必在索引键中集群在一起。因此,索引不提供获得数据的快速和正确的方法。SET EXPLAIN 输出显示了此种情况的顺序扫描。
警告:SQL 语句将一个字符列与一个长度不等于该字符列的非字符值进行比较时,数据库服务器不使用索引。