本篇文章给大家带来了关于mysql数据库的相关知识,主要整理了数据库基础的一下知识点,包括索引、语法顺序、执行顺序、存储过程等等相关问题,希望对大家有帮助。
推荐学习:mysql教程
Atomicity
)Consistency
)Isolation
)Durability
)SQL
标准定义了四种隔离性:(下面隔离性是由低到高,并发性由高到低)
select
获取的数据都不能被修改,这样就可以避免一个事务前后读取不一致的情况。但是没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据;总结:四个级别逐渐增强,每个级别解决问题,事务级别越高,性能越差。
隔离级别 脏读 不可重复读 幻读
未提交读(read uncommitted) 可能 可能 可能
已提交读(read committed) 不可能 可能 可能
可重复读(repeatable read) 不可能 不可能 可能
可串行化(serializable) 不可能 不可能 不可能
总结:未提交读会造成脏读—>已提交读解决脏读,但会造成不可重复读—>可重复读解决读取结果前后不一致的情况,但是造成幻读(以前没有,现在有)—>可串行化解决了幻读,但是增加很多范围锁,可能会造成锁超时;
(1)普通索引(它没有任何限制。)
(2)唯一性索引(索引列的值必须唯一,但允许有空值。)
(3)主键索引(一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。)
(4)组合索引
(5)聚集索引 按照每张表的主键构造一颗B+树,并且叶节点中存放着整张表的行记录数据,因此也让聚集索引的叶节点成为数据页。
(6)非聚集索引(辅助索引)(页节点不存放一整行记录)。
(1)如果条件中有or,即使其中有条件带索引,也不会使用(尽量少用or);
(2)Like查询是以%开头,例如SELECT * FROM mytable WHEREt Name like’%admin’;
(3)如果列类型是字符串,那一定要在条件中使用引号引起来,否则不会使用索引;
MyISAM
,InnoDB
,Memonry
三个常用MySQL
引擎类型比较:
索引 MyISAM索引 InnoDB索引 Memonry索引
B-tree索引 支持 支持 支持
Hash索引 不支持 不支持 支持
R-Tree索引 支持 不支持 不支持
Full-text索引 不支持 暂不支持 不支持
因为在使用二叉树的时候,由于二叉树的深度过大而造成I/O读写过于频繁,进而导致查询效率低下。因此采用多路树结构,B树的各种操作能使B树保持较低的高度。
B树又叫平衡多路查找树,一棵m阶的B树特性如下:
即当sql中存在下面的关键字时,它们要保持这样的顺序:
select[distinct]、from、join(如left join)、on、where、group
by、having、union、order by、limit;
即在执行时sql按照下面的顺序进行执行:
from、on、join、where、group by、having、select、distinct、union、order by
group by要和聚合函数一起使用,
例如:
select a.Customer,sum(a.OrderPrice) from orders a where a.Customer=’Bush’ or a.Customer = ‘Adams’ group by a.Customer;
实现多表查询(内连接)
select u.uname,a.addr from lm_user u inner join lm_addr a on u.uid = a.uid;
使用select from where
同样可以实现
select u.uname,a.addr from lm_user u, lm_addr a where u.uid = a.uid;
delimiter $$ create procedure procedure_bill() comment '查询所有销售情况' begin select billid, tx_time, amt from lm_bill; end $$ delimiter ;
调用存储过程
call procedure_bill();
查看存储过程
show procedure status like 'procedure_bill';
在数据库中,如果两个表的之间的关系为多对多的关系,如:“学生表和课程表”,一个学生可以选多门课,一门课也可以被多个学生选;根据数据库的设计原则,应当形成第三张关联表。
步骤1:创建三张数据表Student ,Course,Stu_Cour
/**学生表*/ CREATE TABLE Student ( stu_id INT AUTO_INCREMENT, NAME VARCHAR(30), age INT , class VARCHAR(50), address VARCHAR(100), PRIMARY KEY(stu_id) ) /*学生课程表*/ CREATE TABLE Course( cour_id INT AUTO_INCREMENT, NAME VARCHAR(50), CODE VARCHAR(30), PRIMARY KEY(cour_id) ) /**学生课程关联表*/ CREATE TABLE Stu_Cour( sc_id INT AUTO_INCREMENT, stu_id INT , cour_id INT, PRIMARY KEY(sc_id) )
第二步:为Stu_Cour关联表添加外键
/*添加外键约束*/ ALTER TABLE Stu_Cour ADD CONSTRAINT stu_FK1 FOREIGN KEY(stu_id) REFERENCES Student(stu_id); ALTER TABLE Stu_Cour ADD CONSTRAINT cour_FK2 FOREIGN KEY(cour_id) REFERENCES Course(cour_id);
完成创建!
alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名)
;例: alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id);
当你访问数据库时,不管是手工访问,还是程序访问,都不是直接读写数据库文件,而是通过数据库引擎去访问数据库文件。
以关系型数据库为例,发SQL语句给数据库引擎,数据库引擎解释SQL语句,提取出你需要的数据返回给你。因此,对访问者来说,数据库引擎就是SQL语句的解释器。
主要区别:
MYISAM
是非事务安全型的,而InnoDB
是事务安全型;NYISAM
锁的粒度是表级锁,而InnoDB
支持行级锁;MYISAM
支持全文本索引,而InnoDB
不支持全文索引MYISAM
相对简单,所以在效率上要优于InnoDB
,小型应用可以考虑使用MYISAM
;MYISAM
表是保存成文件的形式,在跨平台的数据转移中使用MYISAM
存储会省去不少的麻烦;InnoDB
表比MYISAM
表更安全,可以在保证数据不丢失的情况下,切换非事务表到事务表;应用场景:
MYISAM
管理非事务表,它提供高速存储和检索,以及全文搜索能力,如果应用中需要执行大量的select
查询,那么MYISAM
是更好的选择。InnoDB
用于事务处理应用程序,具有众多特性,包括ACID
事务支持。如果应用中需要执行大量的insert
或update
操作,则应该使用innodb
,这样可以提高多用户并发操作的性能。目前关系数据库有6种范式:第一范式{1NF},第二范式{2NF},第三范式{3NF},巴斯—科德范式{BCNF},第四范式{4NF},第五范式{5NF,又称完美范式}。满足最低要求的范式是第一范式。在第一范式的基础上进一步满足更多规范要求的称为第二范式{2NF},其余范式依次类推,一般来说,数据库只需满足第三范式(3NF)就OK了。
范式:
推荐学习:mysql视频教程
以上是MySQL数据库基础知识点储备(整理总结)的详细内容。更多信息请关注PHP中文网其他相关文章!