连接查询(join):
join可以将多个表的字段连接起来,可以指定特定的连接条件。
inner join(内连接):
默认的join,只有数据存在的时候才会发生连接,结果不能出现空行。
outer join(外连接):
如果数据不存在,也会出现在结果集中。
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,如果右表中的没有对应数据,按null补充。
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,如果左表中的没有对应数据,按null补充。
natural join(自然连接):
自动判断连接的条件完车连接。
索引:
索引是一种用于快速查询和数据检索的数据结构。
例子:索引就像是书本里的目录,可以让我们快速定位到想要查看的内容。
常见的数据结构一般有B树,B+树和Hash。
优点:可以大大的加快我们信息检索的速度。
缺点:维护索引需要耗费资源,而且当修改数据的时候,索引也需要修改。存储索引也需要耗费一定的存储空间。
B 树& B+树:
B树,一种多路平衡查找树。B+树是B树的一种变种。
目前绝大部分的数据库系统都使用B树或者是B+树作为索引。
B树的结构类似于二叉查找树,但与二叉查找树不同的是,B树一个节点里可以放多对key和value的值,而且是多叉的树。
二叉查找树的查询元素时间复杂度为O(logn),查询时最坏的情况下次数等于树的高度(元素在叶子结点的情况下)。我们在进行磁盘io的时候,是把数据一页一页的写进内存中的,每个磁盘页对应的就是一个树的节点,所以IO的次数相当于树的高度。
B树通过将多个元素放在一个节点里,可以有效的降低树的高度,从而减少IO的次数,提高超找的效率。
B+树是B树的一种变体,对B树进行了优化。
B 树& B+树两者有何异同呢?
- B 树的所有节点既存放键(key) 也存放 数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。这样的话,同样大小的磁盘页可以存放更多的节点元素,相同的数据量下,树会变得更加矮胖,所需的IO操作更少。
- B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
- B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。
索引类别:
主键索引:使用主键作为索引。一张表的主键是唯一的,而且不重复,所以可以作为索引。在mysql的innodb中,如果没有指定主键,那么首先innodb首先会查找表中是否有唯一的字段可以作为主键,如果没有就会创建一个自增的主键。
二级索引:又叫做辅助索引,叶子结点存储的value是主键。通过辅助索引可以定位到主键。
- 唯一索引(Unique Key) :唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
- 普通索引(Index) :普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。
- 前缀索引(Prefix) :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。
- 全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。
唯一索引,普通索引,前缀索引都是辅助索引。
聚集索引与非聚集索引:
聚集索引:索引与真实数据放在一起的索引叫做聚集索引。
优点:查询速度快,定位到了索引的节点,就相当于定位到了需要查询的数据。
缺点:更改的代价大,索引修改,数据页需要修改。主键索引的主键一般不可以修改。
非聚集索引:
辅助索引就是非聚集的索引。索引与数据分开存放就是非聚集索引。
叶子节点可以存放指针,也可以存放主键。
优点:更新的代价相对较小,因为叶子结点不存放真实的数据。
缺点:会导致二次查询(回表)。当根据非聚集索引查询到索引的位置后,需要拿着指针或者是主键再到数据文件中二次查询。
什么是覆盖索引? (非聚集索引问题)
如果一个索引包含了所需要查询字段的值,那么我们就是称之为覆盖索引。
我们知道在 InnoDB 存储引擎中,如果不是主键索引,叶子节点存储的是主键+列值。最终还是要“回表”,也就是要通过主键再查找一次。这样就会比较慢覆盖索引就是把要查询出的列和索引是对应的,不做回表操作。
覆盖索引即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了, 而无需回表查询。
例子:
select name from table where name = “xxx”;
这里一般的情况下如果是非聚集索引需要通过索引查询到定位的主键,然后回表通过主键在查询到数据。但如果name字段已经建立了索引,那么这里就不需要回表了,回直接返回对应的name。
冗余索引指的是索引的功能相同,能够命中索引(a, b)就肯定能命中索引(a) ,那么索引(a)就是冗余索引。如(name,city )和(name )这两个索引就是冗余索引,能够命中前者的查询肯定是能够命中后者的 在大多数情况下,都应该尽量扩展已有的索引而不是创建新索引。 ----- 著作权归