设为首页 加入收藏

TOP

mysql优化笔记(一)
2015-11-21 01:47:00 来源: 作者: 【 】 浏览:0
Tags:mysql 优化 笔记
【mysql优化部分】
优化大致思路:
a. 表的设计合理化(符合3NF)
b. 添加适当的索引(index)
mysql的索引大致分为四类:
普通索引、主键索引、唯一索引、全文索引
c. 分表技术(水平分割、垂直分割)
d. 读写分离(读 select 写 insert/delete/update)
e. 存储过程(模块化编程,可以提高速度)
f. 对MySQL的配置优化(如 最大并发数 max_connections等)
g. MySQL服务器硬件升级
h. 定时清除不必要的数据 定时进行碎片整理(尤其是myisam存储引擎)


【一、表的设计合理化】

1、表的设计原则



1NF:表的列属性不可分割。(关系型数据库都满足,不必考虑)
2NF:表中的记录唯一。(通过设置主键来实现)
主键一般不含业务逻辑,自增长
3NF:表中不含冗余数据(表的某些字段能被推导出来,
就不应该单独设计字段来存放他们)


有时候会用到反3NF的字段设计表。
例如:
[分类表]:id view
[详细表]:id view name cid
其中[分类表]中的浏览量要通过计算[详细表]中的浏览量得来
那么我们可以,在[分类表]中也加一个view字段,
在更新[详细表]的时候,也增加[分类表]中的view值,那么提取的
时候可以免于计算,提高查询效率。


总的来说,需要计算得出的字段,尽量不要在查询的时候
进行计算,将他们改在更新或插入的时候作为一个字段计算好。


2、字段的设计原则(保短不保长)



能用tinyint 就不要用 int
如果能用char 就不要用varchar
能用varchar 就不要用 text
...
总而言之,就是尽量使用合适的字段类型设计表的字段。


【二、选择合适的存储引擎】

1、选取原则

myisam:表对事务的要求不高,主要以查询和添加修改为主,
考虑使用此引擎(如评价表等)。
innodb:对事务的要求高,保存的都是重要数据,建议使用
此引擎(如订单表、账号表)。
memory:数据变化频繁,不需要入库。同时频繁的查询和修改,
考虑使用此引擎(如用户的登录状态等)。
注:memory数据存在内存中,重启mysql会丢失。


2、myisam与innodb的区别

① 事务安全(innodb)
② 查询和添加速度(myisam)
③ 支持全文索引(myisam)
④ 锁机制(innodb)
⑤ 外键(innodb)


3、大量数据写入

① 对于myisam,关闭索引
alter table table_name disable keys;
插入加载数据
alter table table_name enable keys;
因为创建表的时候会自动创建索引,这样负载会加大


② 对于innodb
将要插入的数据按主键进行排序
set unique_checks=0;#关闭唯一索引(唯一性检查影响效率)
set autocommit=0; #关闭自动提交


【三、建立合适的索引】



四种索引的使用(主键、唯一、全文、普通索引)


1、主键索引

添加索引 alter table art add primary key(id);
删除索引 alter table art drop primary key;


2、唯一索引

表的某一列被指定为unique 关键字是时 即为唯一索引
唯一索引允许为null 和 ''
但是可以允许多个null值存在,不能有多个''(空串)存在
create unique index 索引名 on 表名 (列名1,...)


3、全文索引

在创建表的时候创建
create table art(
id int primary key,
title varchar(20),
body text,
FULL TEXT(title,body)
) engine=myisam charset utf8;


注意:
① 全文索引只支持myisam引擎
② mysql 系统提供的全文索引,只支持英文,不支持中文
如果要支持中文的话,需要 下载sphinx插件
③ 全文索引有一个停止词,在一篇文章中,创建全文索引是一个
无穷大的数,所以只会给不常见的词创建全文索引。
④ 使用全文索引必须遵循使用规则 match() against();
select * from art where match(title,body) against('daye');




4、普通索引

create index 索引名 on 表名(列名);
alter table 表名 add index 索引名(列名);


删除索引: alter table 表名 drop index 索引名


5、索引的查询

① 表结构查询
desc 表名;


② 查询单个索引
select index(索引名) from 表名\G


③ 查询表的所有索引
show keys from 表名\G


④ 查看索引的使用情况
show status like 'handler_read%'
handler_read_key 高 说明索引使用率高
handler_read_rnd_next 高 说明查询效率低


6、索引的使用原则

① 创建了多列的索引,只有最左侧的列被使用时,索引才会被使用
② 使用like 关键字进行查询时,开头不能有通配符'%'、'_'等
否则不会使用索引
③ 条件中含or关键字 不会使用索引


7、索引添加原则 与 优缺点

①优点 查询速度快 使用二叉树log2n次查询
②缺点 占用磁盘空间
对dml语句(非查询语句) 频繁操作的表 会导致速度变慢
③添加原则
添加where子句中频繁使用到的字段为索引
唯一性太差的字段不适合单独做索引






【四、表的分割技术】



1、水平分割

即将一个表复制成多张表 结构不变
原则:
① 表结构不变
② 应根据业务的需求,找到分表的标准,并在检索页面
约束用户权限。


[例] 一张qq登录表,几亿条数据 qqlogin
我们根据用户 id%3 的余数决定将用户存入哪一张表
uuid(自动生成用户id)
qqlogin0(存入id求余结果为0的用户)
qqlogin1(存入id求余结果为1的用户)
qqlogin2(存入id求余结果为2的用户)


2、垂直分割

即将一张表中 常用 和不常用的字段分离出来,组成两张不同表
原则:
① 将表中不常用的字段分离出来
② 将表中数据量较大,会影响查询速度的表分离出来
③ 注意分离表与原表的关联关系


【五、读写分离】



1、表的主从复制

insert into tab1
select col1 col2 ... from tab2;




【六、主从复制】

(略) 详细后面章节进行讲解




【七、定位慢查询sql】

(注意:这里慢查询不一定只指select语句,其它语句执行速度
比较慢的也叫慢查询)
SQL优化一般思路:
1、通过show status 命令了解各种sql执行的效率
2、定位执行效率较低的sql语句
3、通过explain 分析低效率sql语句的执行情况
4、确定问题采取相应的措施


1、通过show status 命令了解各种sql执行的效率

show [session|global] status like '%%';
其中:session为当前的会话窗口统计。默认项
global 则为所有会话窗口统计。


① mysql的运行时间:
show stat
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql 在windows下的安装,开发基.. 下一篇mysql之InnoDB内存管理

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: