今天学习了一下MySQL的优化的内容,做下笔记先。MySQL可以从多个方面进行优化,SQL语句的优化,数据库结构优化,索引优化,存储引擎优化等。今天就说一下SQL语句的优化,我们经常会用用到以下语法的sql:
select ... from ... where ....
我们知道,如果采用ID查询的话可以非常快地将一条记录查询出来,但是也有很多情况下我们只用到其他列去查询,这时候MySQL会进行全表扫描,全表扫描是非常耗时的。如何进行优化呢?对于简单的query当然是加索引啦,那么索引怎么加?加在哪里?对于初学者来说这个是个问题。那么哪些列需要加索引呢,答案是where 语句中用到的列例如:
<pre name="code" class="sql">select * from student where stu_name = 'zhangsan';
以上的语句中如果stu_name没有加索引,那么就需要给它加一个索引,问题是怎么知道它有没有加索引?使用explain 关键字:
explain select * from student where stu_name = 'zhangsan';
explain 关键字可以打印出sql语句运行时的执行计划,也就是MySQL如何去解释并且执行这个sql。以下是一個例子:
以上就是一个sql的执行计划,关于每个值的意思可以到官网查看官方文档http://dev.mysql.com/doc/refman/5.7/en/explain-output.html。我们现在主要看possible_keys,key
在没有索引的情况下这两个字段为空,并且查询所需时间为0.19
加上索引之后这两个字段保存的是索引的名称,查询时间为0.09因为数据量不是很大,所以差别不是特别明星,但是也可以看到加上索引之后为我们带来的性能提升。对于大表来说,应该尽量避免全表扫描,索引的目的就为了避免全表扫描。另外所以对于联表查询,或者使用到外键时就更加重要了。
接下来说一下函数调用的,函数调用怎么优化?其实主要是对函数作用的范围的优化,也就是说你调用的函数是对整个表还是对一个结果集,一般情况下我们会对结果集调用一个函数,如果对全表调用那就太耗时了。
使用analyze table语法定期更新统计表,这样优化器才能得到最新信息去执行制定一个执行计划,语法如下:
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE
tbl_name [, tbl_name] ..
学了这一点点算是优化MySQL的一个开始了吧,后续还有很多相关的优化,例如对于sql的优化还可以通过调整缓存池的大小,调整表的存储引擎类型,多个session访问表时锁的问题。