数据库调优学习

参考博文:

https://blog.csdn.net/hzy38324/article/details/44903207

1、数据库基本操作

CREATE TABLE QQUser
(
qqid BIGINT PRIMARY KEY,
PASSWORD VARCHAR(20) NOT NULL,
lastlogtime DATETIME NOT NULL,
online INT NOT NULL,
LEVEL INT NOT NULL
);

insert  into `qquser`(`QQid`,`Password`,`lastlogTime`,`Online`,`level`) 
values (1,'a123456','2017-03-02 00:00:00',1,6),
(2,'b123456','2017-03-02 00:00:00',2,7),
(3,'c123456','2018-03-01 00:00:00',2,6),
(4,'d123456','2018-03-02 00:00:00',2,8),
(7,'g123456','2012-02-02 00:00:00',0,-1),
(8855678,'gues0221','2008-02-21 16:28:20',1,6),
(54789625,'add512#&','2008-02-16 17:01:35',2,1),
(88662753,'admin0219','2008-02-19 21:08:35',0,5);

select RelationQQID as QQ号码,NickName as 昵称,Age as 年龄
from BaseInfo,Relation
where BaseInfo.QQID=Relation.RelationQQID
and Relation.QQID=54789625
and RelationStatus=0 或者1

SELECT BaseInfo.Province,COUNT(*) AS 总人数 FROM Relation,BaseInfo
WHERE Relation.RelationQQID=BaseInfo.QQID
AND Relation.RelationStatus=0
AND Relation.QQID=54789625
GROUP BY BaseInfo.Province
ORDER BY 总人数 DESC

UPDATE BaseInfo SET NickName='被淹死的鱼',Address='解放中路号院室'
WHERE  QQID=8855678

DELETE FROM Relation WHERE QQID=54789625 OR RelationQQID=54789625

2、三大范式五大约束

第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;

第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;

第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);

1.primary KEY:设置主键约束;
2.UNIQUE:设置唯一性约束,不能有重复值;
3.DEFAULT 默认值约束,height DOUBLE(3,2)DEFAULT 1.2 height不输入是默认为1,2
4.NOT NULL:设置非空约束,该字段不能为空;
5.FOREIGN key :设置外键约束。

3、优化经验

+ 发现慢查询: 慢查询是指执行时间超过慢查询时间的sql语句。查看慢查询时间方法:show variables like 'long_query_time';

对慢查询时间进行修改:set global long_query_time=1;

记录慢查询到日志中,

+ Explain的作用是生成一个QEP(查询执行计划),可以帮助我们在不真正执行某个sql语句时,就看到mysql怎样执行,这样方便我们去分析sql指令的好坏。

Type  ALL全表扫描,通常是不好的,其他的如index、range、const、ref、system则是较好的

+ 索引的原理是利用特殊的查找算法(如二叉树算法),限制访问的行数,提高访问效率。另外,索引还可以高效地在表之间建立连接操作,高效的对结果进行排序等等。索引可以分为主键索引、普通索引、唯一索引和全文索引。

当一张表,把某个列设为主键的时候,则该列就是主键索引;普通索引的创建,是先创建表,然后在创建普通索引。create index 索引名 on 表 (列名1,列名2);当表的某列被指定为unique约束时,这列就是一个唯一索引;

全文索引,只对MyISAM引擎有用。主要是针对对文件,文本的检索, 比如文章或者段落,.它会把某个数据表的某个数据列出现过的所有单词生成一份清单。

查询索引:show index from xxx

索引的代价:索引是有开销的,表现在添加索引后.ibd文件(innodb引擎)或者.myi文件(myisam引擎)会变大;dml变慢,添加索引后之所以会快,是因为表依据索引对数据按某种算法(二叉树等)进行排序,所以删除、增加、插入后二叉树要重新排序,导致执行效率降低。

不使用索引的情况: 数据唯一性差的字段不要使用索引、频繁更新的字段不要使用索引、字段不在where语句出现时不要添加索引

+ 优化sql语句

优化limit:select * from test1 where id>=100000 order by id limit 10

尽量避免SELECT *命令

不让排序:在使用group by 分组查询时,默认分组后,还会排序,可能会降低速度。在group by后面增加 order by null 就可以防止排序.

使用连接来替代子查询:有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。select * from sales2 where company_id not in(select id from company2)

select * from dept, emp where dept.deptno=emp.deptno;

左外连接,效率最高:select * from dept left join emp on dept.deptno=emp.deptno;

利用LIMIT 1取得唯一行

使用 EXISTS代替in

没有必要时不要用DISTINCT和ORDER BY

其它优化方法:改配置文件,修改连接数、配置缓存、使用存储过程

4、存储过程

一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

 >存储过程就是具有名字的一段代码,用来完成一个特定的功能。

 >创建的存储过程保存在数据库的数据字典中。

create procedure begin      end。

猜你喜欢

转载自blog.csdn.net/chenkaifang/article/details/81369108