zoukankan      html  css  js  c++  java
  • 网站优化—MySQL优化

    MySQL优化

    简介

    由于页面静态化技术可以实现对动态数据的缓存,但是有的时候还是需要去请求数据库。所以对数据库的优化也是不可缺少的。

    优化思路

    设计:存储引擎,字段,范式

    自身:索引,自身的缓存

    架构:读写分离

     

    存储引擎:

    MyISAM和InnoDB之间的对比。当然需要知道MySQL除了这两种存储引擎还有其他的存储引擎(memory存储引擎)。

    MySQL在5.5版本之后默认的存储引擎为InnoDB

    在面试的过程中,只要说出MyISAM和InnoDB的区别即可

     

    字段选择:

    合适即好,能用tinyint就不要使用int

     

    范式:三范式 主要是为了减少数据的一个冗余,基本上设计出来的表都是满足的。

     

    注意:一般在开发的时候,设计之初,最先设计的就是表与表之间的关系,在后期的开发过程中是很少修改表结构的。(系统架构、经理)

     

    自身考虑

    在做MySQL自身优化的时候,既然要去优化,那就要先去发现问题?如何发现问题?

    发现问题

    1. 需要去定位问题?

      答:可以使用MySQL提供的一种慢查询日志功能来发现有问题的sql语句,然后对其进行优化。

    2. 什么事慢查询日志?

      答:MySQL提供的日志,可以用来记录超过某一个规定的时间界限的sql语句。

      使用MySQL的慢查询功能

    3. 开启,MySQL的配置文件里面,默认是不存在的,需要自己去添加,需要重启MySQL

       

    4. 测试看是否能够记录超过时间界限的sql语句
      1. 需要构建一张大型数据表

      b) 在没有索引的字段上做一个查询

      慢查询日志分析:

      注意:在有索引的字段上做查询操作

       

      总结:通过对比发现使用索引之后,明显查询的速度会快很多,但是使用MySQL的慢查询日志功能记录的时间相对来说还是很粗糙(慢查询的记录时间级别只能是 1s 以上的)的。

      这个时候如果需要记录时间为 1s 以下的时候,慢查询就无法发挥其作用,可以使用MySQL提供另外一个功能来完成,这个功能叫做 profile

       

      MySQL的profile的使用

      MySQL提供的一个可以记录更加精确时间的功能,能在1s 以下的sql语句都记录下来。

       

    5. 使用:默认是关闭的,需要自己开启

      # show varibales like "%profil%"; 当有的时候无法记清的时候,可以使用这种模糊匹配查询。

    6. 开启

      # set profiling=1;

    7. 简单的测试

      # show profiles; 可以查看profile工具记录的时间

    8. 使用该工具还可以详细的分析这个sql语句在执行的时候,每一步(如:连接,权限检查,sql语句编译,打开表。。。。执行,数据返回)花费的时间。
      1. 例如现在详细的定位第四条sql语句执行时候每一步花费的时间

        # show profile for query 4;

      注意:为什么使用索引之后会那么快?

      答:由于MySQL启动的时候一般也会将索引文件载入内存里面,即使没有,索引的载入也比去磁盘上对一条一条的查找要快。 然后索引本身是非常利于查找的一种结构,这个时候可以通过索引快速的去定位需要查询的数据,当查询到之后,然后在去磁盘上将数据取出来。

       

      总结:通过使用上面的这些工具,可以粗略发现,在使用索引之后,效果有明显的提升,所以有必要对MySQL数据库进行索引方面的优化操作。

       

      MySQL索引简介

      MySQL索引的分类

    9. 主键索引:主要是其快速查找约束的效果,并且一张表里面只能有一个主键索引。不允许字段里面出现null
    10. 唯一索引:主要是快速查找和约束,但是字段可以有null存在,在建立唯一索引的字段上面的信息不允许重复,但是可以为多个字段建立多个唯一索引。
    11. 普通索引:主要是为了快速查找,但是需要注意的是,索引建立也是有代价的。索引能快速的查找,但是在数据插入、更新的时候,索引会影响插入的效率。所以普通索引也不要建立的过多。
    12. 全文索引:一般都是对text字段生效,但是由于MySQL的存储引擎只有MyISAM支持,并且只支持英文,所以可以使用另外的一个软件叫做sphinx来代替全文索引。
      1. 还有一种情况,就是需要注意一般使用 like 做模糊查询的时候 select * from tableName where name like "%张%"; 是无法使用索引的。 like这种查询就要做全表扫描。

      索引的管理

      索引是一种排好序的,快速查找的数据结构。

      什么叫排好序

      例如上面的这个结构,可以发现,在D字母之后是不可能在出现A字母相关的信息的。

       

    13. 索引的创建
      1. 建表时候创建

      1. 在修改表结构时候创建

       

    14. 索引显示

       

    15. 索引的删除

      问题:为什么没有提供更新操作?

      答:没必要专门设计一个更新,只需要先删,在建。

       

      索引的结构

      由于索引本身也是一种数据,也需要占据磁盘空间,所以索引也是有数据结构的,常见的数据结构分为两类:B-TREE结构聚簇结构

       

      B-TREE结构

      对于B-TREE结构的索引,索引节点里面保存的是物理行地址,当查询的时候需要做回行的操作。对于MyISAM存储引擎的所有索引时候的都是B-TREE结构。

      结构图:

      聚簇结构

      对于聚簇结构的索引,索引节点里面保存的是该行的记录,当查询的时候不需要做回行的操作。对于InnoDB存储引擎的所有索引时候的都是聚簇结构。

      注意1:对于InnoDB的存储引擎来说,如果不存在主键索引,这个时候MySQL会自动的维持一个主键索引。

      注意2:对于InnoDB的存储引擎来说,次级索引(唯一和普通索引)的索引节点里面保存的信息是对主键索引的一个引用。

      注意3:对于InnoDB的存储引擎来说,如果是大批量的添加数据,这个时候会有很大的性能开销, 主要是在大批量插入数据的时候,主键索引也会重建,这个时候由于主键索引的索引节点里面保存的是该行的一个记录,所以要大批量的在内存中移动,开销非常大。

      结构图:

       

      扩展

      阅读书籍

      <<高性能MySQL>>

      地址:

      http://www.linuxidc.com/Linux/2014-10/108464.htm

       

      问题1:

      解决思路:

      只要使得上面的两个条件中的一个或者两个都不成立即可。

      那可以做一个刷新缓存的按钮,再要在缓存有效期内更改了,就清除生成的静态页。

  • 相关阅读:
    Serverless
    Kubernetes
    下一代微服务-ServiceMesh
    SOA服务治理
    微服务架构
    RPC之Thrift
    【MySQL】MySQL高可用架构之MHA
    远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
    Redis与Memcached的区别
    LVS简介
  • 原文地址:https://www.cnblogs.com/nyxd/p/5369846.html
Copyright © 2011-2022 走看看