[MySql学习笔记] 六 索引

  索引在数据库中是用B-树来实现的,穿件索引的命令时 CREATE [UNIQUE] INDEX 索引名 ON 表名(列名,...)例如: CREATE INDEX idx_lname_pinyin ON employee(lname_pinyin)。

  使用命令SHOW INDEX FROM 表名,可以查看表中所有的索引, 删除索引 可以使用 DROP INDEX 索引名 ON 表名;

  创建唯一索引,相当于给列加了一个唯一性约束。

  确认索引使用情况,用EXPLAIN 如   EXPLAIN SELECT * FROM employee WHERE lname_pinyin='wang' \G

 

  那些情况不能使用索引

  1. 进行后方一致/部分一致检索的场合:使用LIKE进行模糊检索是,只有在进行前方一致的检索是能使用上索引,而后方一致/部分一致检索的场合下式使用不上索引的。例如 SELECT * FROM employee WHERE lname_pinyin LIKE '%w%';   SELECT * FROM employee WHERE lname_pinyin LIKE '%w';  都不能用,但是 SELECT * FROM employee WHERE lname_pinyin LIKE 'w%';   就能用。
  2. 使用了IS NOT NULL、 <>比较运算法的场合也是不能使用索引的,例如 SELECT * FROM employee WHERE lname_pinyin IS NOT NULL; SELECT * FROM employee WHERE lname_pinyin <> 'wang';
  3. 对列使用了运算/函数的场合:对索引列使用了函数或进行了某些运算的情况,也是不能使用索引的。如 SELECT * FROM employee WHERE YEAR(birth)= '1980'; 由于使用了YEAR函数(从日期中取出年份),所以不能使用索引。可以想办法将上述语句中条件左侧的函数或运算符去掉后,就能使用索引,例如,将上面的语句改造成以下形式后,就能使用索引了: SELECT * FROM employee WHERE birth >= '1980-01-01' AND birth<= '1980-12-31';
  4. 复合索引的第一列没有包含在WHERE条件语句中的场合:比如对于表employee我们创建了以下复合索引。 CREATE INDEX idx_pinyin ON employee(lname_pinyin, fname_pinyin);  针对这个索引,如果我们单独检索lname_pinyin列,或者同事检索lname_pinyin与fname_pinyin列时,该索引是会被使用到,即如下检索语句将使用索引: SELECT * FROM employee WHERE fname_pinyin='wang' AND fname_pinyin='xiao'; 和 SELECT * FROM employee WHERE lname_pinyin = 'wang' ;   但是下面的语句将不能使用索引 SELECT * FROM employee WHERE fname_pinyin='xiao';和SELECT * FROM employee WHERE lname_pinyin='wang' OR fname_pinyin='xiao';
posted @ 2012-12-06 15:50  liangflying  阅读(183)  评论(0编辑  收藏  举报