网站优化—MySQL优化
MySQL优化
简介
由于页面静态化技术可以实现对动态数据的缓存,但是有的时候还是需要去请求数据库。所以对数据库的优化也是不可缺少的。
优化思路
设计:存储引擎,字段,范式
自身:索引,自身的缓存
架构:读写分离
存储引擎:
MyISAM和InnoDB之间的对比。当然需要知道MySQL除了这两种存储引擎还有其他的存储引擎(memory存储引擎)。

MySQL在5.5版本之后默认的存储引擎为InnoDB
在面试的过程中,只要说出MyISAM和InnoDB的区别即可
字段选择:
合适即好,能用tinyint就不要使用int

范式:三范式 主要是为了减少数据的一个冗余,基本上设计出来的表都是满足的。
注意:一般在开发的时候,设计之初,最先设计的就是表与表之间的关系,在后期的开发过程中是很少修改表结构的。(系统架构、经理)
自身考虑
在做MySQL自身优化的时候,既然要去优化,那就要先去发现问题?如何发现问题?
发现问题
- 需要去定位问题?
答:可以使用MySQL提供的一种慢查询日志功能来发现有问题的sql语句,然后对其进行优化。
- 什么事慢查询日志?
答:MySQL提供的日志,可以用来记录超过某一个规定的时间界限的sql语句。
使用MySQL的慢查询功能
- 开启,MySQL的配置文件里面,默认是不存在的,需要自己去添加,需要重启MySQL

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

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

慢查询日志分析:

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

总结:通过对比发现使用索引之后,明显查询的速度会快很多,但是使用MySQL的慢查询日志功能记录的时间相对来说还是很粗糙(慢查询的记录时间级别只能是 1s 以上的)的。
这个时候如果需要记录时间为 1s 以下的时候,慢查询就无法发挥其作用,可以使用MySQL提供另外一个功能来完成,这个功能叫做 profile 。
MySQL的profile的使用
MySQL提供的一个可以记录更加精确时间的功能,能在1s 以下的sql语句都记录下来。
- 使用:默认是关闭的,需要自己开启
# show varibales like "%profil%"; 当有的时候无法记清的时候,可以使用这种模糊匹配查询。

- 开启
# set profiling=1;

- 简单的测试
# show profiles; 可以查看profile工具记录的时间

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


注意:为什么使用索引之后会那么快?
答:由于MySQL启动的时候一般也会将索引文件载入内存里面,即使没有,索引的载入也比去磁盘上对一条一条的查找要快。 然后索引本身是非常利于查找的一种结构,这个时候可以通过索引快速的去定位需要查询的数据,当查询到之后,然后在去磁盘上将数据取出来。
总结:通过使用上面的这些工具,可以粗略发现,在使用索引之后,效果有明显的提升,所以有必要对MySQL数据库进行索引方面的优化操作。
MySQL索引简介
MySQL索引的分类
- 主键索引:主要是其快速查找和约束的效果,并且一张表里面只能有一个主键索引。不允许字段里面出现null
- 唯一索引:主要是快速查找和约束,但是字段可以有null存在,在建立唯一索引的字段上面的信息不允许重复,但是可以为多个字段建立多个唯一索引。
- 普通索引:主要是为了快速查找,但是需要注意的是,索引建立也是有代价的。索引能快速的查找,但是在数据插入、更新的时候,索引会影响插入的效率。所以普通索引也不要建立的过多。
- 全文索引:一般都是对text字段生效,但是由于MySQL的存储引擎只有MyISAM支持,并且只支持英文,所以可以使用另外的一个软件叫做sphinx来代替全文索引。
- 还有一种情况,就是需要注意一般使用 like 做模糊查询的时候 select * from tableName where name like "%张%"; 是无法使用索引的。 like这种查询就要做全表扫描。
索引的管理
索引是一种排好序的,快速查找的数据结构。

什么叫排好序?
例如上面的这个结构,可以发现,在D字母之后是不可能在出现A字母相关的信息的。
- 索引的创建
- 建表时候创建

- 在修改表结构时候创建

- 索引显示


- 索引的删除

问题:为什么没有提供更新操作?
答:没必要专门设计一个更新,只需要先删,在建。
索引的结构
由于索引本身也是一种数据,也需要占据磁盘空间,所以索引也是有数据结构的,常见的数据结构分为两类: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优化的更多相关文章
- MySQL优化详解
MySQL优化 MYSQL优化主要分为以下四大方面: 设计:存储引擎,字段类型,范式与逆范式 功能:索引,缓存,分区分表. 架构:主从复制,读写分离,负载均衡. 合理SQL:测试,经验. 一.存储引擎 ...
- 优化MySQL,还是使用缓存?读一篇文章有感
今天我想对一个Greenfield项目上可以采用的各种性能优化策略作个对比.换言之,该项目没有之前决策强加给它的各种约束限制,也还没有被优化过. 具体来说,我想比较的两种优化策略是优化MySQL和缓存 ...
- 开启Mysql慢查询来优化mysql
开启Mysql慢查询来优化mysql 优化sql语句是优化数据库的一个很重要的方面,那么怎么发现那些耗时耗资源的sql语句呢,开启Mysql慢查询! 1.查看是否开启慢查询,默认情况下是关闭的.你的m ...
- MySQL优化技巧
目录 MySQL的特点 数据类型优化 整型类型 小数类型 字符串类型 时间类型 主键类型的选择 特殊类型的数据 索引优化 一个使用Hash值创建索引的技巧 前缀索引 多列索引 聚簇索引 覆盖索引 重复 ...
- 网站优化之mysql优化
一,网站优化之mysql优化:1.前缀索引,可以通过前缀去识别唯一性,把这个前缀作为索引内容,可以节省存储索引的空间,从而提高索引的查询速度.distinct 排重操作2,2.in条件索引使用同时查询 ...
- 网站访问量大 怎样优化mysql数据库
MySQL优化的一些建议,单机MySQL的优化我分为三个部分,一是服务器物理硬件的优化,二是 MySQL安装时的编译优化,三是自身配置文件my.cnf的优化:如果单机的优化也解决不了你的数据库的压力的 ...
- Mysql优化系列(0)--总结性梳理
对于一个网站来说,在运行很长一段时间后,数据库瓶颈问题会越来越暴露出来.作为运维人员,对数据库做必要的优化十分重要!下面总结以往查阅到的以及自己工作中的一些优化操作经验,并根据OSI七层模型从下往上进 ...
- mysql优化之连接优化(open-files-limit与table_open_cache)
MySQL打开的文件描述符限制 Can't open file: '.\test\mytable.frm' (errno: 24) OS error code : Too many open file ...
- MYSQL 优化建议
转自 http://coolshell.cn/articles/1846.html MYSQL 优化建议20条 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效 ...
随机推荐
- 使用FileSystem类进行文件读写及查看文件信息
使用FileSystem类进行文件读写及查看文件信息 在这一节我们要深入了解Hadoop的FileSystem类——这是与与hadoop的文件系统交互的重要接口.虽然我们只是着重于HDFS的实现, ...
- Java面向对象---类与对象的关系
类是对某一类事物的描述,是抽象的.概念上的意义.对象是实际存在的该类事物的每一个个体,也被称为实例. 创建对象:包括声明对象和实例化对象 Person person;//声明 person = new ...
- CQRS之旅——旅程3(订单和注册限界上下文)
旅程3:订单和注册限界上下文 CQRS之旅的第一站 "寓言家和鳄鱼是一样的,只是名字不同" --约翰·劳森 描述: 订单和注册上下文有一部分职责在会议预订的过程中,在此上下文中,一 ...
- 4 Template层- HTML转义
1.HTML转义 Django对字符串进行自动HTML转义,如在模板中输出如下值: 视图代码: def index(request): return render(request, 'temtest/ ...
- vrpie在Visio Studio 中无法调试的问题
最近这这几天一直在研究vrpie,之前不能调试,一调试就出问题,打开那个生成的htm文件是没问题的,最初的解决方法是不通过调试来打可那个htm页面,但是这样比较麻烦,因为经常需要和服务器交互,就只能用 ...
- 实战小项目之嵌入式linux图像采集与传输
项目简介 本次编程实战主要是围绕嵌入式linux v4l2采集框架展开,包括以下几个部分: v4l2视频采集 IPU转码 framebuffer显示 自定义UDP简单协议进行传输 上位机软件 ...
- python正则 转
python中的正则表达式(re模块) 一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编 ...
- Struts2 标签库与OGNL的使用
- Log4j官方文档翻译(六、日志的级别)
org.apache.log4j.Level 类提供了下面几种日志级别,你也可以通过继承这些类,自定义级别 ALL 所有日志级别都包括 DEBUG 指定信息事件的粒度是DEBUG,在调试应用的时候会有 ...
- P2412 查单词
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...