MySQL引起索引失效的原因汇总

# 对索引列 进行运算,导致索引失效

运算包括:
+、-、*、/、%
!=、<>
like'%_'(%放在前面)
or
in 、 not in
等等

注意:
SQL中有两种方式表示不等于;一种是 <> 另一种是 != 用法是一样的。

# 类型错误,如字段类型为varchar,where条件用number

例:template_id字段是varchar类型。
错误写法:select * from template t where t.template_id = 1
正确写法:select * from template t where t.template_id = '1'


# 对索引应用内部函数,这种情况下应该建立基于函数的索引

select * from template t  where ROUND(t.logicdb_id) = 1 
此时应该建ROUND(t.logicdb_id)为索引。


# is null 索引失效; is not null ,Betree索引生效


# 建立联合索引,where条件单字段
假如有INDEX(a,b,c),当条件为 a 或 a,b 或 a,b,c 时都可以使用索引
但是当条件为 b 或 c 或 b,c 时将不会使用索引

测试表
CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `id_no` varchar(20) DEFAULT NULL COMMENT '身份证号码',
  `address` varchar(255) DEFAULT NULL,
  `phone` varchar(30) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `status` char(255) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


## 单列索引
ALTER TABLE person ADD INDEX id_no_index (id_no);

CREATE INDEX id_no_index ON person (id_no);


## 多列索引
ALTER TABLE person ADD INDEX name_age_index (name,age);


## 唯一索引
ALTER TABLE person ADD UNIQUE id_no_uni_index (id_no);

CREATE UNIQUE INDEX id_no_uni_index ON person (id_no);

## 删除
DROP INDEX index_name ON person;
ALTER TABLE person DROP INDEX index_name;
ALTER TABLE person DROP PRIMARY KEY;

注意:
1.第三种删除索引的方法,只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引;
2.在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复;


# 查看索引
show index from person;
Table 表的名称。 
Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。
Key_name 索引的名称。
Seq_in_index 索引中的列序列号,从1开始。
Column_name 列名称。
Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
Cardinality 索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。
Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
Packed 指示关键字如何被压缩。如果没有被压缩,则为NULL。
Null 如果列含有NULL,则含有YES。如果没有,则该列含有NO。
Index_type 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE。

# 查看MySQL进程
show processlist;
show full processlist;

mysql手册链接:http://dev.mysql.com/doc/refman/5.0/en/general-thread-states.html

猜你喜欢

转载自my.oschina.net/mengzhang6/blog/1799730