mysql 优化点小结
1、数据库表设计的合理性
1)三范式
一范式:原子性,属性不可分;
二范式:无部分依赖,
例:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分),存在部分依赖 (学号) → (姓名, 年龄)
拆分;(学号, 姓名, 年龄),(课程名称, 学分), (学号, 课程名称, 成绩),
三范式:无传递依赖,
例:(学号)→(姓名,年龄,性别,系别,系办地址、系办电话)
传递依赖:
(学号)→ (系别)→(系办地点,系办电话)
再拆分。。。
2)逆范式:
相片表(相片id,名称,点击次数,所属相册id,上传时间)
相册表(相册id,名称,时间)
若有相册点击次数的需求,并且频繁,则需要在相册表添加“点击次数”冗余字段。
添加冗余字段的规范:
一对多的情况
冗余的字段应该尽量在“一”的一方。
若在相片表放冗余字段“相册名称”,虽然反问相册名称方便了。但造成极大的空间浪费,并且极大的提高了修改成本。
3)反外键
有外键关系,但不加入外键约束。
外键的缺点:略
2、sql语句的优化
1)五类sql语句
ddl
dml
select
dtl事务控制语句 commit\rollback\savepoint
dcl数据控制语句 grant\revork
sql优化的核心是select,你知道为什么的。
2)show status命令
查看数据库当前状态,比较有用的几个状态包括:
a) show status like 'Com%' <=> show session status like 'Com%' //当前控制台的情况
b) show global status 'Com%'; //数据库从启动到现在的状态
c) show status like 'Connections' 显示链接数据库的次数
d) show status like 'Uptime' 服务器工作时间(秒)
e) show status like 'Slow_queries' 慢查询的次数(默认是10秒)
3)这里我们优化的重点是慢查询。
a)show variables like 'long_query_time'
默认为10秒,要求高一点,我们设为1秒。
set long_query_time = 1
搞个海量表玩一下,测试性能。
Show status like ‘slow_queres’
发现当前慢查询此时是0。
b)可以自定义函数 + 存储过程,创建一个海量表
自定义函数,产生一个随机字符串:
Delimiter $$
Drop function if exists rand_string;
Create function rand_string(n INT)
Returns varchar(255)
Begin
Declare chars_str varchar(100) default
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
Declare return_str varchar(255) default '';
Declare i int default 0;
While i < n do
Set return_str = concat(return_str,substring(chars_str,floor(1+rand()*52),1));
Set i = i + 1;
End while;
Return return_str;
End $$
Delimiter ; $$
存储过程:
Drop table if exists emp;
Create table emp(
Id int primary key,
name varchar(255),
descp varchar(255),
gene varchar(16)
);
Delimiter $$
Drop PROCEDURE if exists proc_insertemp;
CREATE PROCEDURE proc_insertemp(in start int(10), in max_num int(10) )
Begin
Declare i int default 0;
Set autocommit = 0;
Repeat
Set i = i + 1;
Insert into emp values ((start+i), rand_string(6), 'salesman','man');
Until i = max_num
End repeat;
Commit;
End $$
Delimiter ; $$
使用存储过程
Call proc_insertemp(10000, 20000);
c)mysql支持把慢查询语句记录到日志中,供程序员分析。
默认情况是不启用的。
进入到mysql安装目录,启动--slow-query-log
d)索引
show indexes from tb
主键索引 alter table tb add primary key (keyname);
唯一索引 unique 即该列具有唯一性,同时又是索引。
普通索引 index
全文索引fullindex(仅mylsam支持)
复合索引(多列在一起,联合索引)从左到右顺序。
中文索引
sphinx + 中文分词coreseek
4)explain指令
explain select * from tb where id = 2000
select_type: simple
table: tb
type: all //检索类型
possible_keys: primary //可能用到的索引
key: primary //实际用到的索引
key_len:
ref:
rows: 1 //从多少条记录中取出,因为有索引,所以是1
extra: using where //using temporary using filesort等
查询全表的逻辑在真实的项目里是没有道理的,必然存在分页的逻辑。分页必然有索引
5)索引添加场景
a) 较频繁的作为查询条件的字段应该创建索引
b)唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
select * from tb where sex = 'n男';
c)更新非常频繁的字段,不适合添加索引。
6)不会用到索引的情况
a)like%放前边不会用到索引,放在中间和后面才能用到;
b)对于复合索引,只要查询条件使用了最左边的列,索引一般就会被使用。而如果只使用右边的列,则不会被使用。
c)如果mysql估计使用全表扫描比使用索引快,则不使用索引。
7)使用索引的注意事项
a)如何检测索引是否有效
show status like 'Handler_read%'
b)handler_read_key值越高,表示使用索引查询到的次数越多
c)handler_read_key值越高,说明查询效率低
8)常用技巧
对于大批量插入数据
a) myisam先关闭keys,导入完毕再开启;
alter table table_name disable keys;
loading data;
alter table table_name enable keys;
b) 对于innodb 数据排序、关闭唯一性校验(不至于每插入一条校验一条)、关闭自动提交
Set unique_check = 0;
Set autocommit = 0;
group by 会默认排序,可以通过order by null禁用排序;
子查询会生成临时表,可以用join代替;
在精度要求高的应用中,建议使用定点数来存储数值decimal,而不要使用浮点数,以保证结果的准确性。如 10000000.32万,插入float(10,2) 型是10000000.31。
日期类型要根据实际需要选择能满足应用的最小存储的早期类型。用时间戳的话,很方便按范围搜索。比如查前三天的记录。但注意int型时间戳,只能表示到2038年。
图片的存储采用路径存储。甚至专门的图片服务器(图床)
9)MylSAM和Innodb的区别
- MyISAM是非事务安全型的,而InnoDB是事务安全型的。
- MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
- MyISAM支持全文类型索引,而InnoDB不支持全文索引。
- MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
- MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
- InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。
前者有存储缓存,需要手动回收过期数据。MyISAM创建一张表,对应三个文件,如果Innodb则只有一个文件 *.frm
对于MyISAM数据库,需要定时清理。
optimize table 表名。
show engines;字段 Support为:Default表示默认存储引擎 。默认为Innodb。
3、数据库参数配置
把缓存设置大一些:
innodb_additional_mem_pool_size = 64M
innodb_buff_pool_size = 1G
key_buff_size
4、硬件配置和操作系统
内存超过4G,用64位系统
5、分表读写分离
1)表的分割,水平分割(分库分表)、垂直分割(将表的粒度化小)
2)读写分离:缓解查询压力
a)判断请求的sql语句,判断dml语句,则由master处理,slave定时同步master数据。
b)判断若读的sql,则由lvs从slave读取即可。
mysql 优化点小结的更多相关文章
- [转载] 新浪微博MySQL优化的小结和反思
原文: http://mp.weixin.qq.com/s?__biz=MzA4Nzg5Nzc5OA==&mid=206762682&idx=1&sn=1233ed1496d7 ...
- mysql优化, 删除数据后物理空间未释放(转载)
mysql优化, 删除数据后物理空间未释放(转载) OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTI ...
- MySQL 优化实战记录
阅读本文大概需要 2 分钟. 背景 本次SQL优化是针对javaweb中的表格查询做的. 部分网络架构图 业务简单说明 N个机台将业务数据发送至服务器,服务器程序将数据入库至MySQL数据库.服务器中 ...
- MySQL优化聊两句
原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...
- 0104探究MySQL优化器对索引和JOIN顺序的选择
转自http://www.jb51.net/article/67007.htm,感谢博主 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准备参考本文最后部分" ...
- mysql 优化
1.存储过程造数据 CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_test_data`(`n` int) begin declare i ...
- mysql优化笔记之分页
过年闲得蛋疼,于是看看mysql优化,看了网上好多关于分页的优化方法,但是呢,我亲自试上一把的时候,没有出现他们说的现象...难道是我的机器问题么? 下面看看我的实践记录,希望看到的加入进来交流一下O ...
- MySQL优化概述
一. MySQL优化要点 MySQL优化是一门复杂的综合性技术,主要包括: 1 表的设计合理化(符合 3NF,必要时允许数据冗余) 2.1 SQL语句优化(以查询为主) 2.2 适当添加索引(主键索引 ...
- MySQL优化实例
这周就要从泰笛离职了,在公司内部的wiki上,根据公司实际的项目,写了一些mysql的优化方法,供小组里的小伙伴参考下,没想到大家的热情很高,还专门搞了个ppt讲解了一下. 举了三个大家很容易犯错的地 ...
随机推荐
- 转:PHP超时处理全面总结
原文来自于:http://wulijun.github.io/2012/08/08/php-timeout-summary.html 概述 在PHP开发工作里非常多使用到超时处理的场合,我说几个场景: ...
- Xamarin Mono错误: unable to find explicit activity class
unable to find explicit activity class在android开发很常见,网上一般是java的解决办法,对我们这些xamariner就无语了. xamarin中用attr ...
- House Of Hello恶搞包为什么如此受热捧!
凤凰时尚 在大多数人的心中,奢侈品都是昂贵的,摆在精美的橱窗中,动辄上万的价格,高贵而冷艳,也让很多人望而却步.然而,最近在很多时尚年轻一族中却流传着这样一句话“昂贵不等于奢侈,奢侈是一种生活态 ...
- Python使用纯真年代数据库qqwry.dat转换物理位置
PS:网上直接找的,贴出来,方便以后随时用,感谢分享的人. #!/usr/bin/python #encoding: utf-8 import socket import codecs import ...
- [BZOJ 3747] [POI 2015] Kinoman【线段树】
Problem Link : BZOJ 3747 题解:ZYF-ZYF 神犇的题解 解题的大致思路是,当区间的右端点向右移动一格时,只有两个区间的左端点对应的答案发生了变化. 从 f[i] + 1 到 ...
- 10个简单实用的 jQuery 代码片段
尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库. 今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 1.平滑滚动到 ...
- RTF格式文件浅析
ps:这两天在分析从微软的word复制一个绕排环绕的表格到openoffice的writer中去的bug,需要了解RTF... RTF是Rich TextFormat的缩写,意即多文本格式.这是一种类 ...
- 分页SQL模板
select * from ( select rownum as rn ,a.* from ( select * from page a where object_id >1000 and ow ...
- The Same Game(模拟)
http://poj.org/problem?id=1027 题意:给一个10*15的地图,里面填充R,G,B三种颜色,每次找到当前地图的同色最大区域M,并将其删除,删除M后,上面的小球自然下落,当有 ...
- HDOJ(HDU) 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
Problem Description 当抢救人员发现她的时候,她已经死了,是被垮塌下来的房子压死的,透过那一堆废墟的的间隙可以看到她死亡的姿势,双膝跪着,整个上身向前匍匐着,双手扶着地支撑着身体,有 ...