经过字段类型转化后的查询不走索引


总结:索引字段上有发生int到varchar、varbinary的类型转换,不会使用到索引
而如在索引字段上发生varchar向int的类型转化,仍然会使用到索引

表结构如下:

mysql> show create table tag_item_list\G
*************************** 1. row ***************************
       Table: tag_item_list
Create Table: CREATE TABLE `tag_item_list` (
  `tag_item_list_id` bigint(20) unsigned NOT NULL auto_increment,
  `tag_id` bigint(20) unsigned NOT NULL,
  `item_type` bigint(20) unsigned NOT NULL,
  `item_id` varchar(100) NOT NULL,
  `list_id` bigint(20) unsigned NOT NULL,
  `deleted` tinyint(1) NOT NULL,
  `item_ext1` bigint(20) NOT NULL default '0',
  `item_ext2` bigint(20) NOT NULL default '0',
  `item_ext3` bigint(20) NOT NULL default '0',
  `relation_ext1` bigint(20) NOT NULL default '0',
  `relation_ext2` bigint(20) NOT NULL default '0',
  `relation_ext3` bigint(20) NOT NULL default '0',
  PRIMARY KEY  (`tag_item_list_id`),
  KEY `idx_iid_itp` (`item_id`,`item_type`),
  KEY `idx_tid_itp` (`tag_id`,`item_type`)
) ENGINE=InnoDB AUTO_INCREMENT=231210 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
 

索引字段上有发生int到varchare、varbinary的类型转换,不会使用到索引


mysql> explain  SELECT sql_no_cache * from tag_item_list where item_id = 122 and item_type = 1 ;  
+----+-------------+---------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+---------------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | tag_item_list | ALL  | idx_iid_itp   | NULL | NULL    | NULL | 231852 | Using where | 
+----+-------------+---------------+------+---------------+------+---------+------+--------+-------------+
1 row in set (0.00 sec)

mysql> explain  SELECT sql_no_cache * from tag_item_list where item_id = '122' and item_type = 1 ;
+----+-------------+---------------+------+---------------+-------------+---------+-------------+------+-------------+
| id | select_type | table         | type | possible_keys | key         | key_len | ref         | rows | Extra       |
+----+-------------+---------------+------+---------------+-------------+---------+-------------+------+-------------+
|  1 | SIMPLE      | tag_item_list | ref  | idx_iid_itp   | idx_iid_itp | 310     | const,const |    1 | Using where | 
+----+-------------+---------------+------+---------------+-------------+---------+-------------+------+-------------+
1 row in set (0.00 sec)
 

而如在索引字段上发生varchar向int的类型转化,仍然会使用到索引

mysql> show create table tag_item_list\G
*************************** 1. row ***************************
       Table: tag_item_list
Create Table: CREATE TABLE `tag_item_list` (
  `tag_item_list_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `tag_id` bigint(20) unsigned NOT NULL,
  `item_type` bigint(20) unsigned NOT NULL,
  `item_id` int(10) NOT NULL,
  `list_id` bigint(20) unsigned NOT NULL,
  `deleted` tinyint(1) NOT NULL,
  `item_ext1` bigint(20) NOT NULL DEFAULT '0',
  `item_ext2` bigint(20) NOT NULL DEFAULT '0',
  `item_ext3` bigint(20) NOT NULL DEFAULT '0',
  `relation_ext1` bigint(20) NOT NULL DEFAULT '0',
  `relation_ext2` bigint(20) NOT NULL DEFAULT '0',
  `relation_ext3` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`tag_item_list_id`),
  KEY `idx_itemid_type` (`item_id`,`item_type`),
  KEY `idx_tayid_type` (`tag_id`,`item_type`)
) ENGINE=InnoDB AUTO_INCREMENT=226322 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

mysql> explain  SELECT sql_no_cache * from tag_item_list where item_id = '122' and item_type = 1 ;
+----+-------------+---------------+------+-----------------+-----------------+---------+-------------+------+-------+
| id | select_type | table         | type | possible_keys   | key             | key_len | ref         | rows | Extra |
+----+-------------+---------------+------+-----------------+-----------------+---------+-------------+------+-------+
|  1 | SIMPLE      | tag_item_list | ref  | idx_itemid_type | idx_itemid_type | 12      | const,const |    1 |       |
+----+-------------+---------------+------+-----------------+-----------------+---------+-------------+------+-------+

测试mysql版本 5.0.51b,5.1.45

转载于:https://www.cnblogs.com/muliu/p/6495630.html

### 回答1: 关联查询中,如果两个表的字段类型不一致,使用转换函数可以将它们转换为相同的类型,从而应用索引。这是因为索引是按照字段类型进行排序和搜索的,如果字段类型不一致,就无法直接应用索引。因此,使用转换函数可以将字段类型转换为相同的类型,使得索引可以正常应用,提高查询效率。 ### 回答2: 关联查询字段类型不一致使用转换函数应用索引的原因是为了优化查询的性能。 在关联查询中,如果连接的字段类型不一致,例如一个字段是字符串类型,另一个字段是数字类型,那么数据库在进行查询时会进行类型转换。这种类型转换会导致查询的效率降低,因为数据库需要对每一条记录进行类型转换后再进行比较。 如果对这个字段应用索引,可以有效地提高查询的性能。使用转换函数可以将字段类型转换为相同的类型,从而使得数据库可以直接使用索引进行查询,而不需要进行类型转换操作。这样能够大大减少查询的时间,提高查询的效率。 但是需要注意的是,使用转换函数应用索引也有一些限制。首先,转换函数不能影响字段的排序顺序,否则索引将无法正确地工作。其次,转换函数应该是确定性的,即对于相同的输入,转换函数的输出应该是相同的。否则,数据库查询时可能无法正确使用索引。 总而言之,关联查询字段类型不一致时,使用转换函数应用索引可以提高查询的效率,但需要满足一定的限制条件。 ### 回答3: 关联查询中,当进行字段类型不一致的比较时,如果想要使用索引来提高查询效率,需要使用转换函数进行类型转换。 原因如下: 1. 数据类型不同导致索引无法直接比较:索引是根据字段的数据类型建立的,如果进行的比较操作的两个字段类型不一致,那么索引将无法直接进行比较,并且无法利用索引进行优化查询。 2. 使用转换函数进行类型转换:为了解决字段类型不一致的问题,可以使用转换函数来进行类型转换,将不同类型字段转换为相同的数据类型,从而可以进行比较操作。 3. 转换函数应用索引:一些数据库管理系统支持将转换函数应用于索引查询中,例如使用CAST()函数来转换字段类型。通过转换函数,将不同类型字段转换为相同类型后,可以利用索引来提高查询效率。 需要注意的是,转换函数应用索引也有一定的限制和性能影响。首先,转换函数的性能开销会增加查询的执行时间。其次,如果转换后的字段数据类型仍然与其他字段类型不匹配,那么仍然无法利用索引进行优化查询。 综上所述,关联查询字段类型不一致时,可以使用转换函数进行类型转换,以便利用索引来提高查询效率。但需要注意转换函数的使用限制和性能影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值