MySQL简单优化
1:对 MySQL 优化是一个综合性的技术,主要包括:
a、标的设计合理(符合 3NF)
b、添加适当索引(index)(普通索引、主键索引、唯一索引 unique、全文索引)
c、分表技术(水平分隔、垂直分隔)
d、读写(写delete/update/add)分离
e、存储过程(模块化编程,可以提高速度)
f、对 MySQL 配置优化(配置最大并发数,调整缓存大小)
g、MySQL 服务器硬件升级
h、定时的清除不需要的数据,定时进行碎片整理(myISAM)
2:什么样的表才是符合 3NF(范式)
表的范式,是首先符合 1NF,才能满足 2NF,进一步满足 3NF。
2.1:1NF:即表的列具有原子性,不接在分解,即列的信息粉能分解,只要数据库是关系型数据库(mysql、oracle、db2、informix、sysbase、sql sever),就自动满足 1NF。
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。
简而言之,第一范式就是无重复的列。
数据库的分类:
关系型的数据库:mysql、oracle、db2、informix、sysbase、sql sever
非关系型数据库:特点:面向对象或者是集合
NoSql数据库:MongoDB(特点是面向文档)
2.2: 2NF:表中的记录是唯一的,就满足 2NF,通常我们设计一个主键来实现。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
要求实体的属性完全依赖于主关键 字,简而言之,第二范式就是非主属性非部分依赖于主关键字。
主键不含业务逻辑
2.3: 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。简而言之,第三范式就是属性不依赖于其它非主属性。
3NF:即表中不要有冗余,就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个来存放,比如下面的表就不满足
应当为:
反 3NF:但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低凡是标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
3:SQL 语句优化
问题:如何从一个大项目中迅速的定位执行速度慢的语句(定位慢查询)
①首先我们要了解 MySQL 数据库的一些运行状态如何查询(比如想知道当前MySQL运行时间、一共运行了多少次select/update/delete。。、当前链接)
常用 执行命令:
show status like "uptime"; //开启了多长时间
show status like "com_select"(come_delet\com_update); //执行了多少次查询(删除,添加)
show [session | global] status like ... 如果不写[session | global] 默认是session(当前)会话,指去除当前窗口的执行,如果想看所有(从MySQL启动到现在,则应该加入 global)
show status like "connections"; //试图链接MySQL服务器的次数
show status like "slow_queries"; //显示慢查询次数
②如何定位慢查询
在默认情况下,MySQL认为 10秒才是一个慢查询
修改 MySQL 的慢查询时间:
a、show variables like "long_query_time"(查询默认慢查询时间)
b、set long_query_time=1;(设置慢查询时间为一秒,重启mysql会恢复到10s)
修改命令执行结束符:delimiter +$$(结束符)
如果把慢查询的sql记录到我们的一个日志中,在默认情况下,我们的mysql不会记录慢查询,需要重启mysql时候,指定慢查询才行
数据库有各种数据对象(表,存储过程,视图,函数,触发器)
先关闭mysql在启动,如果启用了慢查询日志,默认吧这个文件放到my.ini文件中记录的位置(datadir="");
启用慢查: --safe-mode (安全模式)
优化问题:
1、添加索引(全文索引/唯一索引/主键索引/普通索引)
①主键索引:当一张表,把某个列设为主键,则该列表就是主键索引
如果在创建表的时候,没有指定主键索引,也可以在创建表后,再添加
命令:alter table 表名 add primary key(列明);
例:create table abc (id int, name varchare(32) not null default "");(无索引)
alter table abc add primary key (id); (添加索引)
数据库添加索引会有一定的内存开销,在 data 中会生成三种文件:
.frm:表示表结构
.MYD:表示表数据
.MYI:表示表索引
2、查询索引:
①desc 表名【该方法的缺点:不能显示索引名】
②show index(es) from 表名
③show key from 表名