嘟嘟程序猿

数据库

2019-05-23  本文已影响4人  与搬砖有关的日子

1、常见的数据库优化手段

2、 索引

2.1 什么是索引

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储机构,它是某个表中一列或若干列值得集合和相应得指向表中物理标识这些值得数据页的逻辑指针清单。索引的作用相当于图书的目录,它可以根据目录中的页码快速找到所需的内容。

2.2 索引的优点

建立索引的列可以保证行的唯一性,生成唯一的rowid;建立索引可以有效缩短数据的检索时间;建立索引可以加快表与表之间的连接;为用来排序或者是分组的字段添加索引可以加快分组和排序顺序。索引的缺点:创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大;创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大;创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大;会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长。

2.3 什么样的表要建立索引

总的来说就是数据量大,经常进行查询操作的表要建立索引;表中字段建立索引应该遵循几个原则:越小的数据类型通常更好,简单的数据类型更好,尽量避免NULL,对唯一的字段;表与表连接用于多表联合查询的约束条件的字段应当建立索引;用于排序的字段可以添加索引,用于分组的字段应当视情况看是否需要添加索引;添加多列索引的时候,对应的多条件查询可以触发该索引的同时,索引最左侧的列的单条件查询也可以触发;如果有些表注定只会进行查询所有,也就没有必要添加索引,因为查询全部只能进行全量搜索即扫描全表。

2.4 索引种类

2.5 索引的类型

2.6 B+索引和hash索引的区别

Hash索引,等值查询效率高,不能排序,不能进行范围查询。
B+索引,数据有序,范围有序。
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。
哈希索引就是采用一定的哈希算法,把键值换成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立即定位到相应位置。

2.7 最左匹配原则

最左匹配原则是针对索引的。
创建联合索引的原则:经常用的列优先,散列高的优先,宽度小的优先。
两个字段(name,age)建立联合索引,如果where age=12这样的话没有利用到索引。如果是where name=’xxx’ and age=’xxx’就利用到索引了,如果name和age调换位置也会利用到索引,因为优化器会进行优化如果查询的字段恰好是索引不用回表(覆盖索引)。

image
例:
(a,b,c)索引相当于建立了(a),(a,b),(a,b,c)三个索引,b+树会先检索a,a相同在检索b,c;
(a,b,c,d)的联合索引,a = 1 and b = 2 and c > 3 and d = 4,只会检索到c,如果是(a,b,d,c)都会命因为索引器会优化顺序,检索时遇到比较值会停止匹配;

2.8 索引为什么用B+树

不同于B树只适合随机检索,B+树同时支持随机检索和顺序检索;
B+树的磁盘读写代价更低;
B+树的查询效率更加稳定;
数据库索引采用B+树的主要原因是B树没有解决元素遍历的效率低下的问题。B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历。

3、 数据库连接池

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从缓冲池中取一个,使用完毕后再放回去。优势:资源重用,由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销,也增进了系统运行的平稳性;更快的系统相应速度;新的资源分配手段;统一的连接管理,避免数据库连接泄露。

4、事务:

我们在实际业务场景中,经常会遇到数据频繁修改读取的问题在同一时刻,不同的业务逻辑对同一个表数据进行修改,这种冲突很可能造成数据不可挽回的错乱,所以我们需要对数据进行管理。事务必须服从ACID原则。ACID指的是原子性、一致性、隔离性、持久性。事务其实就是一系列指令的集合。
原子性、稳定性和持久性是通过redo 和 undo 日志文件实现的,undo记录了数据在事务开始之前的值,当事务执行失败或者ROLLBACK时可以通过undo记录的值来恢复数据。redo日志记录数据修改后的值,可以避免数据在事务提交之前必须写入到磁盘的需求,减少I/O。

事务的隔离性:
当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作以保证各个线程获取数据的准确性。数据库事务的隔离级别:

5、MySQL的两种查询引擎区别,各自适用的场景

image image

MYISAM不支持事务,不支持外键,表锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描。
INNODB支持事务,支持外键,行锁,查表总行数时,全表扫描。
MyISAM里data存的是数据地址,索引是索引,数据是数据。
INNODB里data存的是数据本身,索引也是数据。
区别:
一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。
二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

非聚簇索引就是指B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。
聚集索引就是指B+Tree的叶子节点上的data,是数据本身。

6、Explain命令:

我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还需要知道该SQL的执行计划,比如时全表扫描还是索引扫描,这些都需要通过Explain去完成。
EXPLAIN列的解释:

7、 Varchar和Char的使用场景:

用来存储字符,varchar适用于字符长度经常变的,char适用字符长度固定的。
Varchar(20)中的20表示的是varchar数据的数据长度最大是20,超过则数据库不会存储。
Int类型数据的字节大小是固定的4字节,int(11)表示在开启(填充0)情况下,存储的数字长度是小于11则会在不足位数的前面补充0,但是如果大于11位的话,则按实际存储的显示(数据大小在int类型的4字节即可),也就是说int(M)不代表数据的长度。

8、 三大范式

9、数据库中的连接

10、锁

并发控制一般采用三种方法,分别是乐观锁,悲观锁和时间戳

悲观锁分为排他锁(写锁)和共享锁(读锁)。

行级锁是一种排他锁,防止其他事务修改此行。使用insert,update,delete,select语句会自动应用行级锁,使用commit,rollback语句会释放锁。
表级锁分为:行共享(禁止排他锁定表)、行排他(禁止使用排他锁和共享锁)、共享锁(锁定表,对记录只读不写,多个用户可以同时在同一表上应用此锁)、共享行排他(比共享锁更多的限制,禁止使用共享锁及更高的锁)、排他(限制最高的表锁,仅允许其他用户查询该表的行,禁止修改和锁定表)。

上一篇下一篇

猜你喜欢

热点阅读