MySQL如何优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lm9521/article/details/89861453

优化可以从以下几个方面着手:

  1. 表的设计合理化(符合3NF)
  2. 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]
  3. SQL语句优化
  4. 分表技术(水平分割、垂直分割)
  5. 读写[写: update/delete/add]分离
  6. 存储过程 [模块化编程,可以提高速度]
  7. 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]
  8. mysql服务器硬件升级
  9. 定时的去清除不需要的数据,定时进行碎片整理(MyISAM)

一 、数据库三大范式:

第一范式:1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满足1NF)

第二范式:2NF是对记录的惟一性约束,表中的记录是唯一的, 就满足2NF, 通常我们设计一个主键来实现,主键不能包含业务逻辑。

第三范式:3NF是对字段冗余性的约束,它要求字段没有冗余。 没有冗余的数据库设计可以做到。

但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

二、分表分库

垂直拆分:

       垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站不断丰富和壮大的时候,也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求。其实,相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,淘宝在架构不断演变过程,最重要的一环就是服务化改造,把用户、交易、店铺、宝贝这些核心的概念抽取成独立的服务,也非常有利于进行局部的优化和治理,保障核心模块的稳定性

垂直拆分用于分布式场景。

水平拆分:

      上面谈到垂直切分只是把表按模块划分到不同数据库,但没有解决单表大数据量的问题,而水平切分就是要把一个表按照某种规则把数据划分到不同表或数据库里。例如像计费系统,通过按时间来划分表就比较合适,因为系统都是处理某一时间段的数据。而像SaaS应用,通过按用户维度来划分数据比较合适,因为用户与用户之间的隔离的,一般不存在处理多个用户数据的情况,简单的按user_id范围来水平切分。

通俗理解:水平拆分行,行数据拆分到不同表中, 垂直拆分列,表数据拆分到不同表中

【水平拆分可以采用取模算法】

三、SQL优化

定位慢查询

使用show status使用show status查看MySQL服务器状态信息
常用命令
--mysql数据库启动了多少时间
show status like 'uptime';
show  stauts like 'com_select'  show stauts like 'com_insert' ...类推 update  delete(显示数据库的查询,更新,添加,删除的次数)
show [session|global] status like .... 如果你不写  [session|global] 默认是session 会话,指取出当前窗口的执行,如果你想看所有(从mysql 启动到现在,则应该 global)
//显示到mysql数据库的连接数
show status like  'connections '; 
//显示慢查询次数
show status like 'slow_queries';

什么是慢查询 ?

  MySQL默认10秒内没有响应SQL结果,则为慢查询

  可以去修改MySQL慢查询默认时间

--查询慢查询时间
show variables like 'long_query_time';
--修改慢查询时间
set long_query_time=1; ---但是重启mysql之后,long_query_time依然是my.ini中的值

如何将慢查询定位到日志中?

在默认情况下,我们的mysql不会记录慢查询,需要在启动mysql时候,指定记录慢查询才可以

bin\mysqld.exe --safe-mode  --slow-query-log [mysql5.6 可以在my.ini指定](安全模式启动,数据库将操作写入日志,以备恢复)[my.ini在 E:\Program Files\MySQL\ProgramData\MySQL Server 5.6 目录下]

bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]

先关闭mysql服务,cmd安全模式启动, 如果启用了慢查询日志,默认把这个文件放在
my.ini 文件中记录的位置
# Path to the database root
datadir="E:/Program Files/MySQL/ProgramData/MySQL Server 5.6/data\"

打开文件会看到慢查询的sql语句

猜你喜欢

转载自blog.csdn.net/lm9521/article/details/89861453