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

总结:索引字段上有发生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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值