码迷,mamicode.com
首页 > 数据库 > 详细

mysql数据库优化

时间:2019-01-20 18:50:41      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:没有   第三方   数据库   sql数据库   bsp   table   数据访问层   因此   query   

好久没有系统的看书了,今天读下《构建高性能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数据库优化

标签:没有   第三方   数据库   sql数据库   bsp   table   数据访问层   因此   query   

原文地址:https://www.cnblogs.com/wangtengxiang/p/10295362.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!