你的位置:首页 > 数据库

[数据库]MySQL索引


    一、为什么要使用索引

          优化查询,减少扫描的表行数。打个比方,索引的作用就和查新华字典,字典的索引的作用的一样的。

   二、索引的类型

        1、索引是在存储引擎中实现的,而不是在服务器层中实现的。所以,每种存储引擎的索引都不一定完全相同,并不是所有的存储引擎都支持所有的索引类型。

        2、如果使用的是组合索引(即有多个列),需要满足 ”最左前缀“ 的 规则,这和索引的存储方式 B-tree有关。

             参照:最左前缀原则

   三、索引的长度

        desc或者explain命令可以查看索引的key_len:

+----+-------------+-------+------+---------------+----------+---------+----------------------------+-------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+----------+---------+----------------------------+-------+-------+
| 1 | SIMPLE | cry | ALL | NULL | NULL | NULL | NULL | 64733 | NULL |
| 1 | SIMPLE | zd | ref | cry_brzd | cry_brzd | 153 | hospitalinfection.cry.ZYID | 1 | NULL |
+----+-------------+-------+------+---------------+----------+---------+----------------------------+-------+-------+

   key_len为:153 

   gbk的编码一个字符两个字节,而utf8编码的一个字符三个字节。笔者的数据库是utf8编码,建立索引的字段类型为varchar(50):所以,长度为50*3+3=153
 
   四、索引的不足之处
    1、降低了更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
    2、建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。
    3、.......
 
   五、其他
     1、有些查询情况下mysql 是不会使用索引的,即使建立了索引:            

     SELECT * FROM mytable WHERE username like'admin%' ——未使用索引    

     SELECT * FROM mytable WHEREt Name like'%admin'———使用了索引

     2、对查询列使用了mysql函数,或者使用了 not in 、<>等操作符。

     3、全文检索的索引可以建立在text或者varchar字段上面,配合match...against使用,如果想要匹配中文的话,需要使用分词器,或者通过pingyin4j这类库将汉字转化为拼音,再匹配 etc.

     4、......