mysql的优化总结有以下4点
1-数据库(表)设计合理
我们的表设计要符合3NF 3范式(规范的模式) , 有时我们需要适当的逆范式
2-sql语句的优化(索引,常用小技巧.)
3-数据的配置(缓存设大)
4-适当硬件配置和操作系统 (读写分离.)
1-数据的范式
1NF :就是具有原子性,不可分割.(只要使用的是关系性数据库,就自动符合)
2NF: 在满足1NF 的基础上,我们考虑是否满足2NF: 只要表的记录满足唯一性,也是说,你的同一张表,不可能出现完全相同的记录, 一般说我们在 表中设计一个主键即可.
3NF: 在满足2NF 的基础上,我们考虑是否满足3NF:即我们的字段信息可以通过关联的关系,派生即可.(通常我们通过外键来处理)
逆范式:有时候3NF会出现更多的冗余,我们就应该使用逆范式。
范式的选择是更具实际情况来决定的。当一个列的内容过大,更新平凡时候,我们更倾向于逆范式。
2-mysql索引优化
um-面试题 :sql语句有几类
ddl (数据定义语言) [create alter drop]
dml(数据操作语言)[insert delete upate ]
select
dtl(数据事务语句) [commit rollback savepoint]
dcl(数据控制语句) [grant revoke]
dois-控台查看sql命令执行效率
show status命令
该命令可以显示你的mysql数据库的当前状态.我们主要关心的是 “com”开头的指令
show status like ‘Com%’ <=> show session status like ‘Com%’ //显示当前控制台的情况
show global status like ‘Com%’ ; //显示数据库从启动到 查询的次数
显示连接数据库次数
show status like 'Connections';
这里我们优化的重点是在 慢查询. (在默认情况下是10 ) mysql5.5.19
显示查看慢查询的情况
show variables like ‘long_query_time’
tres-对mysql索引优化
对sql语句优化有最方便的就是添加主键了。(主键类似系统替我们分类了,需要的时候直接到某个类别里面找,速度快很多。)
主键好处就是增加速度,不过主键会增大myi文件的体积(牺牲空间来增加速度,这就是索引)
怎么才能合理的索引:
1-经常查询的列上添加索引(where xx=‘’)
2-唯一性太差的列不要加索引。(比如对性别查询。就2种结果,分类太少)
3-列的内容变化很大,(应为索引会去读写.myi文件。变化过于平缓,时间都浪费在读写文件上了)
4-创建多列的索引(复合索引),先把最左边的进行索引,如果没带入最左边的索引,系统不会添加索引。
5-对于like语句 like "%c" 是不会被索引的,而 like 'c%'是可以被索引的。
6-如果条件里面有or ,那么系统不会使用索引(不过我测试索引参数都是有索引,那么系统会使用索引。)
7-如果列的类型是字符串类型的,没有加引号(''),那么系统不会使用索引。
8-如果表的数据很少。我们就不要使用索引了。
索引的种类:
1-主键索引(primary)把某列设置为主键,他会自动变成主键索引。
2-唯一索引(unique),既该列具有唯一性,且是索引。当设置unique时候,系统不会自动添加索引
3-普通索引(index)
4-全文索引(FULLTEXT)
5-复合索引(不是具体的,是多列合在一起)
如何创建索引:
1-如果创建是非主键索引:create [unique|fulltext] index 索引名字 on 表名(列名)
2-如果创建是非主键索引: alter table 表名 add index 索引名字 (列名)
3-添加主键索引:alter table 表名 add primary key (列名)
如何删除索引:
1-删除非主键索引: drop index 索引名 on 表名
2-删除非主键索引: alter table 表名 driop index (索引名字)
3-删除主键索引 :alter table 表名 drop primary key
查询某表的索引:show indexes from 表名;
查看表的存储引擎:show create table 表名
查看索引使用情况:
show status like "Handler_read%"
Handler_read_key 值越高越好
Handler_read_rnd_next 越低越好。
myisam储存和innodb的区别:
1- myisam不支持外键。innodb支持外键
2- myisam不支持事物。innodb支持事物
3- myisam删除数据的时候,不会释放硬盘空间。(必须定时清理)清除指令:optimize table 表名
3-sql语句优化
1-优化order by 排序
order 排序在exlain中可以看出是使用using file这样影响速度。
我们可以这么做:select * from admin order by a,order by null
2-在某些情况下使用join来替换子查询。子查询会在内存里面创建临时表。
3-在精确要求高的应用中,使用定点数(decimal)类型来存储。千万别用float(会误差)
4-分表技术
1-水平分表,把记录分别储存到不同的数据库里。应用于数据量很大的。
2-
4-explain使用
explain是用于测试sql语句的效率。根据返回值,可以得到sql语句是否使用主键,他搜索记录的范围。效率
mysql> explain select * from test2 where id =1 \G
*************************** 1. row ***************
id: 1 //sql语句使用的索引
select_type: SIMPLE //
table: test2 //查询的表名
type: const //有3种情况,all全表查询(最不好),system(这是const连接的一个特例),const(唯一个匹配,速度最好)
possible_keys: PRIMARY,id //可能用到的索引
key: PRIMARY //实际用到的索引
key_len: 4
ref: const
rows: 1 //表示从多少记录里面找出,应为索引关系才显示一,如果没索引就是全部记录
Extra: //查询喜剧信息。no tables(不查表查询) using filesore(如果排序,order by xx不是索引。速度很慢,全表查询)
//using where (通过索引查询,速度比较好)
1 row in set (0.00 sec)