mysql 索引的创建与优化 学习笔记

一. explain

        explain可以用来解析mysql如何处理select语句和链接的表,可以更好的用来调整索引和优化sql语句。

explain各字段说明:

id: 查询标识符,用来标记查询顺序

select_type:选择类型,  simple:简单查询

                                               primary:最外层的子查询

                                               union:union的后一条语句

table:读取的表

type:连接类型              system:表仅有一行,const的特例,一般不会出现

                                          const:表最多只有一行匹配,可以认为是最优化的结果

                                          eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使

                                                         用且索引是unique或primary key

                                          ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或

                                                   PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。ref可

                                                   以 用于使用=或<=>操作符的带索引的列。

                                        all:全表的扫描,在通常情况下很差。

possilble_keys:可能使用到的索引

key:实际使用的索引

key_len:索引长度

ref:ref列显示使用哪个列或常数与key一起从表中选择行。

rows:必须检查的行数

extra:该列包含MySQL解决查询的详细信息。

关于explain的各字段具体含义 请参考 http://database.51cto.com/art/201108/285341.htm

 

 

二. 索引的建立与优化

        mysql支持的索引类型有 hash索引,B-tree索引,R-tree索引,全文索引等,使用比较广泛的是B-tree索引。

B-tree索引的一些注意点:

        假设我们建立了索引 (a,b,c),该索引代表了我们同时创建了(a),(a,b),(a,b,c)三个索引

        1.不能跳过前面的索引,即如果查询是 (b,c)则不会使用这个索引

        2.不能跳过索引,即(a,c)查询不会使用这个索引

        3.如果查询中有范围查询,则不会使用右边的索引,即假如查询中有 b LIKE, 则只会(a)索引

        4.查询表达式中不能含有函数,或者表达式,例如sql : select * from table  where a+1=5则不能使用(a)索引。

        5.索引中不会包含null值,所以尽量不要让字段的默认值是null

        6.如果要对 varchar进行索引并且varchar的长度很长,尽量使用短索引,只对前10到20个字符进行索引

        7.注意索引的顺序,当不需要考虑排序和分组时,将选择性最高的列放在前面一般来说是最好的;有时候还需要根据运行的频率来决定索引的顺序。

        8.NOT IN 和<> 都会进行全局扫面,从而不会使用索引。

        9.对于记录比较少的表,就没有必要加索引了,反而浪费空间

        10.对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。

 

三. linux下完全删除mysql

      rpm -qa | grep mysql

      sudo rpm -e --ndoeps ******mysql***

      删除/var/lib/mysql

     mysql.user表中,修改密码用 password()函数,然后 FLUSH PRIVILEGES;

 

 

你可能感兴趣的:(数据库大杂烩)