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

表结构如下:

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

时间: 2024-11-05 13:36:21

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

mysql数据库函数 concat 字段类型转化、字段拼接

select l.lid, GROUP_CONCAT(s.NAME) shopname, m.realname, u.NAME, m.phone, a.name, concat(l.progress,'') from loan l, bank b, merchant m, bank_user u, area a, shop s where l.bid=b.bid and l.mid=m.mid and l.uid=u.uid and b.aid=a.id and l.lid=s.lid GROU

mongodb字段类型转化

最近在使用mongoDB, 发现mongo对字段类型的定义并不是很严格,完全依赖传入数据的类型,在加上PHP是弱类型的语言,所以难免会出现一些错误.如果预想的类型是Int型,但数据存储的是String,那数据在根据Int型检索的时候,就完全失效了.如果发现某个字段在存储的时候出现了分歧怎么办?当然首先要修正程序在数据传入时候的错误,对于Int型一定要保证其类型的正确性. example: 1 2 3 $user_arr = array (   'uid' => intval ($_SESSION

oracle 查询不走索引的范例分析

like 后%位置不走索引问题 create table t2 as select * from dba_objects;--创建表 create index idx_t2_name on t2(object_name);--创建索引 set autotrace on --开启执行计划跟踪 select * from t2 where object_name like 'DE%';--走索引 select * from t2 where object_name like '%DE';--不走索引

Update关联查询不走索引,效率低下

这两天优化一个sql,就是有A,B两个表,要利用b表的字段更新a表对应的字段.形如 Sql代码 update A set A.a=(select B.b from B where A.id=B.id); 原SQL updatepntmall_rptpoint_detail a set a.scrm_rptpnt_processed=( select distinctb.scrm_rptpnt_processed  frompntmall_rptpoint_detail_tmp b where a

查询不走索引的情况

不走索引的情况还是蛮多的1.条件字段选择性弱,查出的结果集较大,不走索引:2.where条件等号两边字段类型不同,不走索引:3.优化器分析的统计信息陈旧也可能导致不走索引:4.索引字段 is null 不走索引:5.对于count(*)当索引字段有not null约束时走索引,否则不走索引:6.like 后面的字符当首位为通配符时不走索引:7.使用不等于操作符如:<>.!= 等不走索引:8.索引字段前加了函数或参加了运算不走索引:

时间日期函数,类型转化,子查询,分页查询

1.时间日期函数: SET DATEFIRST 1 --设置星期一为第一天--datepart函数,返回时间日期中的某一个部分--参数1是指返回哪一个部分,dw表示dayofweek--参数2是指哪个时间日期里面去返回--datefirst是系统常量,在使用时需要加上@@SELECT @@DATEFIRST AS '1st Day', DATEPART(dw, GETDATE()) AS 'Today'--getdate指在执行时获取当前系统时间SELECT GETDATE()--在执行时取当前

慎使用sql的enum字段类型

在sql的优化中,会有同学提到一点:使用enum字段类型,代替其他tinyint等类型.以前这也是不少人喜欢优化的,但是现在细想,是非常不合理的. 优点: 1.可以设置区间范围,比如设置性别:1男2女3未知.如果这是出现一个非1.2.3类型的,一眼就是脏数据了. 缺点: 1.数据迁移的时候,他几乎不可能被其他数据库所支持,如果enum里面是字符串,对于其他数据库来说就更郁闷了,还不能设为tinyint等类型的字段(enum虽然可以存储字符串,但对于内部来说,还是以顺序进行索引,比如'a','b'

关于用Hibernate执行sql查询,字符字段类型只返回第一个字节的问题

关于用Hibernate执行sql查询,字符字段类型只返回第一个字节的问题 今天遇到了一个问题,就是在Hibernate中,我用sql去查询mysql数据库里面的user表里面的username字段,但是发现查出来的数据都是只有第一个字,例如:在user表里面的username字段中有一条数据是:"Chen chiwei",查询后返回的结果却是这条数据的第一个字母:"C":于是乎,我查了一下user这张表的设计,发现username这个字段的类型是'char'类型,

oracle通过字段类型查询字段

有的时候我们需要在oracle中通过字段名.字段类型.字段长度.字段注释.表名来查询具体的字段信息.比如:昨天同事问我,咱们数据库里面有用过blob类型的吗?我一时也想不起来具体哪个字段或那张表用了blob类型.于是就用如下语句查询库里面所有字段类型为blob.具体sql如下: SELECT b.column_name column_name --字段名 ,b.data_type data_type --字段类型 ,b.data_length --字段长度 ,a.comments comment