MySQL学习记录

1.1 数据库平台单号无重复,导出成excel有重复记录?

UAT的时候甲方爸爸核对数据,导出订单数据后,使用excel的去重功能发现有多条重复记录,于是去数据库查了一下(SELECT tid FROM ip_b_taobao_order GROUP BY tid HAVING count(tid)>1),并无重复,最后才发现原来导出查询使用的排序字段是创建时间,并不是id,因为在MySQL中如果字段值是相同的,按照该字段排序时,顺序是随机的,从而导致导出的数据出现重复行。

1.2 导出表设计的Excel

1)使用下面的sql将结构查询出来

SELECT
	LOWER(COLUMN_NAME) 列名,
	COLUMN_TYPE 数据类型,
	DATA_TYPE 字段类型,
	CHARACTER_MAXIMUM_LENGTH 长度,
	IS_NULLABLE 是否为空,
	COLUMN_DEFAULT 默认值,
	COLUMN_COMMENT 备注
FROM
	INFORMATION_SCHEMA. COLUMNS
WHERE
	-- 数据库名称
	table_schema = 'dev_r3_oms_oc_ip'
AND -- 表名,如果不写的话,默认会查询出所有表的字段
table_name = 'oc_b_order_delivery'

MySQL学习记录_第1张图片
2)然后使用navicat的导出结果功能,导出excel就可以了。

1.3 MySQL索引

索引是什么?
索引是帮助MySQL高效获取数据的数据结构,索引会影响where后面的查找,和order by 后面的排序。
InnoDB的索引结构
mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。
B+树是一种多路搜索树——实现索引结构的在B+树中是只有叶子结点会存储数据,而且所有叶子结点会形成一个链表。而在InnoDB中维护的是一个双向链表。

索引的分类

  1. 从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。
    Hash索引:基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针,虽然可以快速定位,但是没有顺序,IO复杂度高,也就是等值查询快,模糊和范围查找慢。
    B-Tree:能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。
    B+Tree:是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。
    数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。
  2. 从应用层次来分:普通索引,唯一索引,复合索引。
  3. 根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。

普通索引:即一个索引只包含单个列,一个表可以有多个单列索引

唯一索引:索引列的值必须唯一,但允许有空值

复合索引:即一个索引包含多个列

聚集索引:并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。

为什么官方建议使用自增长主键作为索引。自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插
为什么使用 B+树 而不使用二叉树或者B树?
MySQL学习记录_第2张图片
我们知道访问磁盘需要访问到指定块中,而访问指定块是需要 盘片旋转和磁臂移动 的,这是一个比较耗时的过程,如果增加树高那么就意味着你需要进行更多次的磁盘访问。
而使用B+树是因为如果使用B树在进行一个范围查找的时候每次都会进行重新检索,而在B+树中可以充分利用叶子结点的链表。
在建表的时候你可能会添加多个索引,而 InnDB 会为每个索引建立一个 B+树 进行存储索引。
辅助索引上面的叶子节点的值只是存了主键的值,而在主键的聚簇索引上的叶子节点才是存上了整条记录的值。

回表
MySQL在辅助索引上找到对应的主键值并通过主键值在聚簇索引上查找所要的数据。

索引维护
索引是需要占用空间的,可以通过缩减索引的大小来减少索引所占空间。

覆盖索引
查辅助索引的时候就已经满足了需要查的数据,这个时候 InnoDB 就会进行一个叫覆盖索引的操作来提升效率,减少回表。简单来说 覆盖索引 就是当我们走辅助索引的时候能获取到我们所需要的数据的时候不需要再次进行回表操作的操作。

联合索引
假如使用class和 name 做一个联合索引,通过班级号去找对应的学生姓名 ,这个时候我们就可以直接在 辅助索引上查找到学生姓名而不需要再次回表。

最左前缀原则
是一种联合索引的匹配规则。
索引匹配从最左边的地方开始,如果没有则会进行全表扫描,比如你设计了一个(a,b,c)的联合索引,然后你可以使用(a),(a,b),(a,b,c) 而你使用 (b),(b,c),(c)就用不到索引了。还有就是遇到范围匹配也会取消索引,转而全表扫描。如果最左匹配原则因为范围查询终止了,InnoDB还是会索引下推来优化性能。

你可能感兴趣的:(MySQL)