网站优化—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服务器都开启了查询缓存.这是提高性最有效 ...
随机推荐
- 菜鸟学Linux - bash的配置文件
bash是各大Linux发行版都支持的shell.当我们登陆bash的时候,虽然我们什么都没做,但是我们已经可以在bash中调用各种各样的环境变量了.这是因为,系统中已经定义了一系列的配置文件,以及加 ...
- Day24&25&26&27:HTML+CSS
1.网页得三大组成:HTML(标签.皮影的小人) \CSS(布局,皮影的装束) \JS(动作,皮影的操纵者) 2.HTML目录树 3.HTML-标签 成对<>组成,不区分大小写,自闭合标签 ...
- Hotspot GC实现原理
GC扫描 可达性分析的GC Roots主要是全局性引用或在Stack Frame中 ,现在的应用仅仅方法区往往就有几百兆,这样要这个检查这里面的引用,就必然会消耗很多时间,效率很低. 分析工作在一个保 ...
- IOS开发学习笔记034-UIScrollView-xib实现分页
通过xib实现分页功能的封装 1.首先实现xib UIView 的尺寸为300*130,因为准备的图片为600*260. scrollView属性设置如下: 2.新建一个和xib同名的类 2.1 类方 ...
- 《HTTP协议详解》读书笔记---请求篇之响应状态码
在接收和解释请求消息后,服务器返回一个http响应消息.它也分为3个部分:状态行.消息报头.响应正文,格式如下: HTTP-VersionStatus-CodeReason-PhraseCRLF(CR ...
- Python 操作 SQLite 数据库
写在之前 SQLite 是一个小型的关系型数据库,它最大的特点在于不需要单独的服务.零配置.我们在之前讲过的两个数据库,不管是 MySQL 还是 MongoDB,都需要我们安装.安装之后,然后运行起来 ...
- django ORM 外键详解
Django中的外键: 首先,为了方便理解,我们把使用ForeignKey的字段所在的表定义为从表,把ForeignKey中to参数连接的表称为主表. 外键使用的先决条件: 在mysql数据表中,数据 ...
- redis linux 集群
redis集群:官方教程 步骤: 1.安装redis 2.修改配置文件redis.conf(集群所需基础配置) port 7000 cluster-enabled yes cluster-config ...
- nginx的进程模型
nginx采用的也是大部分http服务器的做法,就是master,worker模型,一个master进程管理站个或者多个worker进程,基本的事件处理都是放在woker中,master负责一些全局初 ...
- col-md-push-*和col-md-offset的区别
实现方式的区别:col-md-offset-*,是利用margin-left实现的,col-md-push-*/col-md-pull-*是利用相对定位实现的. 效果的区别,col-md-offset ...