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

网站优化—MySQL优化

时间:2016-04-08 21:46:14      阅读:344      评论:0      收藏:0      [点我收藏+]

标签:

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:

    技术分享

    解决思路:

    技术分享

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

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

网站优化—MySQL优化

标签:

原文地址:http://www.cnblogs.com/nyxd/p/5369846.html

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