mysql数据库优化
Posted wangtengxiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据库优化相关的知识,希望对你有一定的参考价值。
好久没有系统的看书了,今天读下《构建高性能weg站点》的第十一章 数据库性能优化,记录下知识点
知识点:
1、如何查看数据库状态;2、正确使用索引;3、分析sql;4、组合索引;5、慢查询分析
1、状态报告
通过mysql的命令查看数据库状态,缺点:全是数字,不够直观
show status;
show innodb status;
可以使用mysqlreport(基于show status和show innodb status,进行了后期的数据整理),一个第三方MySQL状态报告工具。
2、正确使用索引
全表扫描、索引扫描
索引扫描:适用于快速找到小范围的数据
全表扫描:如果需要获取连续的大范围数据,全表扫描一般比索引扫描更合适
3、分析sql
使用explain命令
如下表:
CREATE TABLE `test` {
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
PRIMARY KEY(`id`)
}
sql:select * from test where id =1;
检测:explain select * from test where id =1;
该sql使用了主键索引
type为const,表示这次查询通过索引直接找到了匹配行,所以优化器认为它的时间复杂度为常亮
key为PRIMARY,意味着这次查询使用了主键索引
接下来我们检测
sql:select * from test where name=‘colin‘;
type为all,这意味着全表扫描,因为name没有索引
如果我们给name加上索引(alter table test add key name(name);),再次检测结果为
type为ref
不过不是所有对name的查询都是用索引,比如
sql:select * from test where name like ‘%colin‘,使用了模糊查询,这时候的检测结果:
type:all意味着全表扫描
4、组合索引
如果sql为
... where a=1 and b=2;
... where a=1 order by b;
... where a=1 group by b;
这时候即使分别建立了a和b的索引,对于该sql检索a对应的数据后,如果数据量特别大,b的索引也爱莫能助。因此我们考虑组合索引。
我们来建一个新表
CREATE TABLE `key_t` (
`id` int(11) NOT NULL auto_increment,
`key1` int(11) NOT NULL default `0`,
`key2` int(11) NOT NULL default `0`,
`key3` int (11) NOT NULL default `0`,
PRIMARY KEY (`id`),
KEY `normal_key` (`key1`, `key2`,`key3`)
) ENGINE=InnoDB
select * from key_t where key1=1 and key2=2 and key3=4;
select * from key_t where key1=1 order by key3;
测试结果:user temporary;use filesort; 这两种方式不受欢迎,越少越好。
5;慢查询
当线上数据量逐渐积累,查询计算的开销越来越大,也许会发现一些索引设计不合理的地方。可是运行环境进行explain分析显然不现实,更难的是你不知道何时去分析哪些查询。
解决方法:
1、通过web应用日志记录所有sql的执行时间,可以封转在数据访问层的查询方法中
2、MySQL提供了慢查询日志,可以将执行时间超过预期阈值的查询记录到日志里,以供后期分析。
mysql开启慢查询的方法:
在my.cnf中增加以下配置项:
long_query_time=1
log-slow-queries=/data/var/mysql_show.log
这意味着mysql会自动执行时间超过1秒的查询记录在指定路径的mysql_show.log中。
选项:
log-queries-not-using-indexes 将所有没有使用索引的查询记录下来
分析慢查询
MySQL自带:mysqldumpslow
第三方:mysqlsla
我们使用mysqlsla来分析mysql日志
mysqlsla -lt show /data/var/mysql_slow.log
以上是关于mysql数据库优化的主要内容,如果未能解决你的问题,请参考以下文章