一. 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;