zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    centos 7 nginx 安装
    搭建Nuget.Server push时,"Failed to process request. 'Method Not Allowed'"
    Failed to create prime the NuGet cache
    Centos 7 安装 Visual stdio Code
    diskpart 格式化u盘 制作u盘启动盘方法
    sql server 2012 数据库日志文件过大,怎么缩小?
    浏览器同源政策及其规避方法
    redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
    php的闭包
    hash一致性算法
  • 原文地址:https://www.cnblogs.com/wangtengxiang/p/10295362.html
Copyright © 2011-2022 走看看