索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。
在数据库系统中建立索引主要有以下作用:
(1)快速取数据;
(2)保证数据记录的唯一性;
(3)实现表与表之间的参照完整性;
(4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。
优点
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
聚集索引/非聚集索引
聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;
聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。
唯一、不为空、经常被查询的字段
插件式存储引擎是MySQL数据库最重要的特性之一,MySQL 5.5之前的默认存储引擎是MyISAM,5.5之后改为了InnoDB。
常用的存储引擎有以下:
Innodb引擎,Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
MyIASM引擎(原本Mysql的默认引擎),不提供事务的支持,也不支持行级锁和外键。
MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址;MyISAM的索引方式也叫做“非聚集”。
nnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。叶节点包含了完整的数据记录,这种索引叫做聚集索引。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。
MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引各有其不同的适用范围。
Hash索引: hash索引,等值查询效率高,不能排序,不能进行范围查询
Btree索引:数据有序,范围查询
红黑树:增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间
B树也就是B-树:B树,查询性能不稳定,查询结果高度不致,每个结点保存指向真实数据的指针,相比B+树每一层每屋存储的元素更多,显得更高一点。
B+树: B+树相比较于另外两种树,B+树非叶子结点只存储key和索引地址,故显得更矮更宽,查询层次更浅。
索引查找过程中就要产生磁盘I/O消耗,主要看IO次数,和磁盘存取原理有关。
根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,
将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入局部性原理与磁盘预读。
MYISAM 不支持外键,表锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描
INNODB 支持外键,行锁,查表总行数时,全表扫描,支持事务
一般来说,创建索引要遵循以下原则。
• 如果每次查询仅选择表中的少量行,应该建立索引。
• 如果在表上需要进行频繁的DML操作,不要建立索引。
• 尽量不要在有很多重复值的列上建立索引。
• 不要在太小的表上建立索引。在一个小表中查询数据时,速度可能已经足够快,如果建立索引,对查询速度不仅没有多大帮助,反而需要一定的系统开销。
1.B-树索引
B-树索引适用于具有高基数的字段,即大部分值都不相同的字段。
2.位图索引
位图索引特定于该列只有几个枚举值的情况
3.反向索引
4.基于函数的索引
经常对某个字段做查询的时候是带函数操作的,那么此时建一个函数索引就有价值了。
1.sql尽量使用索引,而且查询要走索引
2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
3.应尽量避免在 where 子句中对字段进行 null 值判断,尽量避免在 where 子句中使用!=或<>操作符,否则将导致引擎放弃使用索引而进行全表扫描
4.使用union和union all代替or;使用between或exists代替in;
5.做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。
6.任何地方都不要使用SELECT * FROM语句,指明字段。
7.不要在索引列做运算或者使用函数
8.使用合理的分页方式以提高分页的效率(limit)
9.使用查询缓存,并将尽量多的内存缓存查询结果
10.不建议使用%前缀模糊查询
11.join代替嵌套
1.主从复制,读写分离,负载均衡
2.数据库分表、分区、分库
分库解决的是数据库端并发量的问题。分库和分表并不一定两个都要上,比如数据量很大,但是访问的用户很少,我们就可以只使用分表不使用分库。如果数据量只有1万,而访问用户有一千,那就只使用分库。
什么是事务
事务在数据库中主要用于保证数据的一致性,防止出现错误数据。在事务内的语句都会被看成一个单元,一旦有一个失败,那么所有的都会失败。
事务就是一组包含一条或多条语句的逻辑单元,每个事务都是一个原子单位,在事务中的语句被作为一个整体,要么一起被提交,作用在数据库上,使数据库数据永久的修改;要么一起被撤销,对数据库不做任何的修改。
事务在没有提交之前可以回滚,而且在提交前当前用户可以查看已经修改的数据,但其他用户查看不到该数据,一旦事务提交就不能再撤销修改了。
事务有4个特性,它们分别是原子性、一致性、分离性、持久性。
1)原子性:要么完成,要么撤销。
2)一致性:事务执行的前后数据库都必须处于一致性状态。
3)分离性:分离性是指并发事务之间不能相互的干扰。
4)持久性:持久性是指一旦事务提交完成,那么这将是对数据永久的修改。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
MyISAM存储引擎只支持表锁,表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。
InnoDB使用行级锁。支持共享锁和排它锁。
Oracle中分为两种模式的锁,一种是排他锁(X锁),另一种是共享锁(S锁)。
DML锁:该类型的锁被称为数据锁,用于保护数据。
DDL锁:可以保护模式中对象的结构。
内部闩锁:保护数据库的内部结构,完全自动调用。
DML锁主要保证了并发访问时数据的完整性。如果再细分,它又可以分为如下两种类型的锁: 行级锁(TX)和表级锁(TM)。
DDL锁也可以称为数据字典锁,主要作用是保护模式中对象的结构。 DDL锁分为如下3类:
Exclusive DDL Lock,排他DDL锁定。
Shared DDL Lock,共享DDL锁定。
Breakable Parsed Lock,能打破的解析锁定。
1.第一范式
定义: 如果关系模式R中每个属性值都是一个不可分解的数据项,则称该关系模式满足第一范式,简称1NF,记为R∈1NF。
2.第二范式
定义: 如果一个关系模式 R∈1NF,且它的所有非主属性都完全依赖于 主键属性,则称R符合第二范式。
3.第三范式
定义: 如果一个关系模式 R∈2NF,且所有非主属性都不传递函数依赖于任何主键,则称R符合第三范式。(没个属性都跟主键有直接关系而不是间接关系。)
脏读:事务B读取事务A还没有提交的数据
不可重复读:两次事务读的数据不一致
幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看来,明明修改了数据,咋不一样
关系型数据库优点:
1、容易理解
2、使用方便:通用的SQL语言使得操作关系型数据库非常方便;
3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
4、支持SQL,可用于复杂的查询;
5.支持事务
缺点:
1、为了维护一致性所付出的巨大代价就是其读写性能比较差;
2、固定的表结构;
3、不支持高并发读写需求;
4、不支持海量数据的高效率读写
非关系型数据库
1、使用键值对存储数据;
2、分布式;
优点:
无需经过sql层的解析,读写性能很高
基于键值对,数据没有耦合性,容易扩展
存储数据的格式:nosql的存储格式是key,value形式
缺点:
不支持事务
不提供sql支持
1.数据定义语言(DDL)(create/drop/alter)
2.数据操纵语言(DML)(insert/update/delete)
3.数据查询语言(DQL)(select)
4.数据控制语言(DCL)(GRANT/REVOKE)
主键约束、外键约束、唯一约束、检查约束、非空约束。
1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
1.范围分区
2.列表分区
3.散列分区
4.组合分区
主从复制的几种方式:
同步复制:
所谓的同步复制,意思是master的变化,必须等待slave-1,slave-2,…,slave-n完成后才能返回。 这样,显然不可取,也不是MySQL复制的默认设置。比如,在WEB前端页面上,用户增加了条记录,需要等待很长时间。
异步复制:
如同AJAX请求一样。master只需要完成自己的数据库操作即可。至于slaves是否收到二进制日志,是否完成操作,不用关心,MySQL的默认设置。
半同步复制:
master只保证slaves中的一个操作成功,就返回,其他slave不管。 这个功能,是由google为MySQL引入的。
二者最大的区别是:
1).函数(function)总是向调用者返回数据,并且一般只返回一个值;
2).存储过程(procedure)不直接返回数据,但可以改变输出参数的值,这可以近似看作能返回值,且存储过程输出参数的值个数没有限制。