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数据库优化的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库Day03-数据库MySQL的优化

MySQL数据库Day03-数据库MySQL的优化

Mysql的性能优化

Mysql的性能优化

Mysql的性能优化

超详细MySQL数据库优化