1、explain
将explain关键字加在sql语句前,将会列出详细的性能信息。
a、table:指明表名
b、type:连接类型,从最好到最差依次是:system,const,eq_ref,ref,range,index,ALL,possiable_key
c、key:显示mysql实际决定使用的键,如果没有索引被选择,将为null
d、key_len:mysql决定使用的键长度
f、ref:显示那个列或常熟与key一起从表中选择行
g、rows:执行查询的行数
rows<1000,是在可接受的范围内的。
rows在1000~1w之间,在密集访问时可能导致性能问题,但如果不是太频繁的访问(频率低于1分钟一次),又难再优化的话,可以接受,但需要注意观察
rows大于1万时,应慎重考虑SQL的设计,优化SQL,优化db,一般来说不允许频繁运行(频率低于1小时一次)。
rows达到10w级别时,坚决不能做为实时运行的SQL。但导数据场合除外,但导数据必须控制好时间,频度。
h、extra:如果是only index,则表明信息从索引树中检索得到。这要比扫描整个表快。如果包括文字,where userd,它意味着一个where子句将被用来限制那些行与下一个表匹配或发向客户。
通过相乘rows列输出的所有值,可以粗略确定mysql检验多少行以执行查询。
2、delayed
使用insert delayed into tablename values(...),可以延迟插入数据。
用delayed标示过的insert语句将被放入服务器的内存中,形成一个队列,等待插入。何时插入,取决于mysql是否有读行为,如果没有,将执行真正的插入。如果有,将被挂起。直到没有读行为,才插入。如果服务器崩溃或mysql被强行kill,等待插入的队列丢失。
3、procedure analyse()
使用procedure analyse(),将给出每个列最好的类型建议。
使用方式:select * from procedure analyse()
4、一些重要的参数:
delayed_queue_size:使用insert delayed来执行插入时,确定放入的数目
key_buffer_size:索引块的缓存区大小,如果内存够大,可以适当加大该值
back_log:客户机连接请求的数量
read_buffer_size:读操作用的缓存大小
write_buffer_size:写操作用的缓存大小
sort_buffer_size:排序用的缓存大小
5、索引
a、索引最好在myisam表上使用
b、一个复合索引最多包含16个列
c、确定一个列是否适合做索引,看select count(distinct colname)/count(*) from table
如果该值接近0.31就适合做索引(当然越大越好),如果接近0则不适合做索引,也就是说该列没有太多的唯一值,而是有太多的重复值,这样将不适合做索引.
前缀索引不能用于order by和group by
d、对于索引使用列部分做索引,性能将得以优化
f、对于一个sql语句最适合做索引的是where部分和order by部分
h、全文索引:适合的字段类型为char、varchar、text
select title from table where match(title,contet) against('part');
需要注意part,长度如果小于4则停止搜索(当然可以更改此参数);part是以单词(单词分割为空格,逗号等)为单元来搜索,即如果1条记录中含有part,则part必须是个独立的单词,如depart则不能被搜索出来。
全文索引不能很好的支持中文。
如果每条记录都含有part,则没有结果被搜索出来(原因是频度必须小于50%)。
6、group by和having
group by以某列为条件分组
select count(*) from table group by cid;
having则选择符合条件的
select count(*) from table group by cid having count(*)>1000;
以cid分组,并选取每组记录总数大于1000的
7、使用optimize table tablename优化表
8.join
select * from A join B using(col1,col2);
等同于select * from A join B on A.col1=B.col1 and A.col2=B.col2