MYSQL问题点

  • MyISAM 和InnoDB 讲解

InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能

  • MYSQL索引结构(解释B+树)

mysql索引的数据结构就是用到的B+树。
带有顺序访问指针的B+Tree
在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。
如果要查询key为从19到41的所有数据记录,当找到19后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。
磁盘存取原理
索引一般以文件形式存储在磁盘上,索引检索需要磁盘I/O操作。与主存不同,磁盘I/O存在机械运动耗费,因此磁盘I/O的时间消耗是巨大的。

  • Select的执行过程

1、DML语句首先进行语法分析,对使用sql表示的查询进行语法分析,生成查询语法分析树。
2、语义检查:检查sql中所涉及的对象以及是否在数据库中存在,用户是否具有操作权限等
3、视图转换:将语法分析树转换成关系代数表达式,称为逻辑查询计划;
4、查询优化:在选择逻辑查询计划时,会有多个不同的表达式,选择最佳的逻辑查询计划;
5、代码生成:必须将逻辑查询计划转换成物理查询计划,物理查询计划不仅能指明要执行的操作,也给出了这些操作的执行顺序,每步所用的算法,存储数据的方式以及从一个操作传递给另一个操作的方式。
6、将DML转换成一串可执行的存取操作的过程称为束缚过程,

  • 事务隔离级别
    事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)四个特性,简称 ACID

1)原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

2)一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。

3)隔离性(Isolation)
一个事务的执行不能其它事务干扰,即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

4)持续性(Durability)
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,接下来的其它操作或故障不应该对其执行结果有任何影响。
MySQL 事务隔离级别

SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:
1)读未提交(READ UNCOMMITTED) 脏数据
2)读提交 (READ COMMITTED) 不可重复读
3)可重复读 (REPEATABLE READ) 幻读
4)串行化 (SERIALIZABLE)
从上往下,隔离强度逐渐增强,性能逐渐变差,事务都有两面性。

  • 索引回表
    先索引扫描,再通过ID去取索引中未能提供的数据,即为回表。
    1)如果语句是 select * from table where id=5,即主键查询方式,则只需要搜索 id 这棵 B+ 树;
    2)如果语句是 select * from table where name=hzw,即普通索引查询方式,则需要先搜索 k 索引树,得到 id 的值为 5,再到 id 索引树搜索一次。这个过程称为回表。
    3)也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询

  • 索引失效
    索引失效的几种情况
    1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
    要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
    2.对于多列索引,不是使用的第一部分,则不会使用索引。
    3.like查询以%开头。
    4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。
    5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

  • 分库分表

数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。
分表:
分表分为水平分表和垂直分表。
水平分表原理:
在这里插入图片描述
垂直拆分原则:

  1. 把大字段独立存储到一张表中
  2. 把不常用的字段单独拿出来存储到一张表
  3. 把经常在一起使用的字段可以拿出来单独存储到一张表
    在这里插入图片描述

1.为什么要分表:
当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。
mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。
2. mysql proxy:amoeba
做mysql集群,利用amoeba。
从上层的java程序来讲,不需要知道主服务器和从服务器的来源,即主从数据库服务器对于上层来讲是透明的。可以通过amoeba来配置。
3.大数据量并且访问频繁的表,将其分为若干个表。
比如对于某网站平台的数据库表-公司表,数据量很大,这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。
某网站现在的数据量至多是5000万条,可以设计每张表容纳的数据量是500万条,也就是拆分成10张表。
那么如何判断某张表的数据是否容量已满呢?可以在程序段对于要新增数据的表,在插入前先做统计表记录数量的操作,当<500万条数据,就直接插入,当已经到达阀值,可以在程序段新创建数据库表(或者已经事先创建好),再执行插入操作。
4. 利用merge存储引擎来实现分表
如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码,因为程序里面的sql语句已经写好了。用merge存储引擎来实现分表, 这种方法比较适合。

分库策略与分表策略的实现很相似,最简单的都是可以通过取模的方式进行路由。
分库也可以按照业务分库,比如订单表和库存表在两个库,要注意处理好跨库事务。
分表和分库 同时实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值