MySql数据库优化-汇总

Posted huasky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql数据库优化-汇总相关的知识,希望对你有一定的参考价值。

各位,不喜勿喷,和气生财~

数据库优化,是一种综合性的技术,不是通过某一种方式让数据库效率提高很多,而是通过各个方面的优化,来是数据库效率明显的稳步的提高。

主要包括以下:

1、库表的设计优化(三种范式)

2、SQL优化与慢查询

3、库表添加合适的索引

4、分表技术-水平分割与垂直分割

5、定时清楚垃圾数据,定时进行碎片整理

6、多用存储过程和触发器

7、优化MqSql配置

8、读写分离

除此之外,还有 MqSql服务器硬件升级

 

以下进行详细描述

一、库表设计

良好的数据库设计,能够节省数据库空间,保持数据完整性,方便应用程序的开发;(相反:数据冗余,空间浪费,插入更新繁杂或者异常)

设计数据库

1、充分了解需求:标识实体(具体存在的对象、东西,名词),标识实体属性,标识实体关系

以BBS论坛为例

实体:

用户(属性:昵称,密码,邮箱,生日,性别,登记,备注,积分,注册时间)

主贴(属性:标题,正文,发帖时间,状态,发帖人,回复数量,点击数)

回帖(属性:帖子编号,回帖人,回帖标题,回帖正文,回帖时间,点击数)

板块(属性:板块名称,版主,板块格言,点击数,发帖数)

 

2、实体关系

一对一,两个表的主键是公共字段

一对多,主键与非主键之间的关系

多对一,非主键与主键之间 的关系

多对多,非主键与非主键之间的关系

 

3、E-R图,实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型

*1、创建表时,将实体转化为表,将属性转化为列,唯一标识一行数据的列可为主键,无合适字段做主键就用自动增加列, 将关系转化为主外键展示实体之间的关系;

*2、表结构规范化-三范式(1、列的原子性,确保每列都不能再分解成更基本的数据单位;2、非主键字段依赖主键字段,即表的列中若有重复数据且与主键无关,则可拆分表;3、不存在传递依赖,即若表的除主键外各个列间有直接关联,即非主键字段一个字段可以推导出另一个字段,则可拆分表)

范式举例:

山东理工,山东淄博;山大,山东济南;其中山东济南就可以拆分(第一范式)山东理工,山东,淄博;山大,山东,济南;

学号-主,姓名;ID,科目,成绩,学号,姓名;满足第二范式;但不满足第三范式;如果学号非主键,则满足第三范式;

 *但注意,也有第五第六等范式,范式越高表越多,查询效率一般就会降低,一般第三范式效率最高列。。

反三范式:学号,语文,数学,英语,总成绩;总成绩字段就是违反第三范式,适当的数据冗余允许,不然就查询效率低了:select sum(yw+sx+yy) from t_score或单独建表 学号,总成绩;

由此可见,数据库的性能效率比规范化更重要;

 

二、SQL优化与慢查询

1、数据库的增删改查

一般情况下,增删改总计占数据库的10%,而90%是查询操作;

2、show status的相关常用命令

#查看数据库的一些状态
show status;
#显示执行了多少条/次的增删改查
show stauts like ‘com_select‘;
show stauts like ‘com_insert‘;
show stauts like ‘com_delete‘;
show stauts like ‘com_update‘;
#[session|global] 默认是session会话级-只取出当前窗口的执行;global-从mysql启动到现在 
show global stauts like ‘com_select‘;

#查询当前MySQL本次启动后的运行统计时间(单位:秒)-存储引擎为MyISAM,且运行时间过长,则注意碎片整理
show status like ‘uptime‘;
#查看试图连接到MySQL(不管是否连接成功)的连接数
show status like ‘connections‘;
#查看线程缓存内的线程的数量。
show status like ‘threads_cached‘;

#慢查询
#查看查询时间超过long_query_time秒的查询的个数-即慢查询
show status like ‘slow_queries‘;
#可以显示当前慢查询时间(单位:秒)(默认10秒)
show variables like ‘long_query_time‘; 
#可以修改慢查询时间(单位:秒)
set long_query_time=1;

  

3、启动MqSql使用记录慢查询日志(2种)

#第一种:中括号[]内的部分是可选的,file_name表示日志文件路径
#在5.5及以上版本的MySQL中,使用如下命令启动:
mysqld --safe-mode --show-query-log[=1] [--show-query-log-file=file_name]
#在5.0、5.1等低版本的MySQL中,使用如下命令启动:
mysqld --log-slow-queries[=file_name]

#第二种:启动命令配置到my.ini中的[mysqld]节点
[mysqld]
#设置慢查询界定时间为1秒
long_query_time=1
#5.0、5.1等版本配置如下选项
log-slow-queries="mysql_slow_query.log"
#5.5及以上版本配置如下选项
slow-query-log=On
slow_query_log_file="mysql_slow_query.log"

  

三、库表添加合适的索引

 

以上是关于MySql数据库优化-汇总的主要内容,如果未能解决你的问题,请参考以下文章

centos mysql 实战 优化 汇总

Mysql知识汇总之常用索引及sql优化

精华汇总

mysql索引知识点汇总

优化 C# 代码片段、ObservableCollection 和 AddRange

常用数据库中间件汇总