最近面试被问到这样一个问题。这里总结一下。关于更多的MySQL真题,你可以直接访问该链接进行查看。 问题描述 我的主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光?...这意味着,若客户端接收得慢,会导致MySQL服务端由于结果发不出去,这个事务的执行时间变长。...仅当一个线程处于“等待客户端接收结果”的状态,才会显示"Sending to client" 若显示成“Sending data”,它的意思只是“正在执行” 所以,查询的结果是分段发给客户端,因此扫描全表...该策略,就是为了处理类似全表扫描的操作量身定制。...还是扫描200G历史数据表: 扫描过程中,需要新插入的数据页,都被放到old区域 一个数据页里面有多条记录,这个数据页会被多次访问到,但由于是顺序扫描,这个数据页第一次被访问和最后一次被访问的时间间隔不会超过
这是学习笔记的第 2127 篇文章 ? 今天在微信群里大家在讨论一个数据处理的解决方案,各路高手齐上阵,大家从不同的角度都提了一些建议和解决方案,这种讨论蛮有意思。...从这个描述来看,这算是一个开放性的问题,而且是真实的一个场景,我们可以通过这个问题来得出很多的解决思路。...我有几种迭代方案: 1.单独建一个归档库,把这些年的订单放在一起,即可以统一访问入口,比如order表,数据按照业务ID分片(如果没有,自增ID也行,不做业务逻辑接入),底层可以使用mycat分片,唯一性索引需要在订单号上面...当然所说的大表,前提数据量一定得大,否则引入的技术复杂度还不如单表简单。...今天读到的一段文字,让我有一种莫名的感同身受,尽管经历不同:我希望你们不要和我一样,耽误了十二年,快被业内淘汰的时候才把早该弄明白的问题搞清楚。
为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们具体是如何对数据库如何进行垂直拆分或水平拆分的? 为什么要分库分表?...(设计高并发系统的时候,数据库层面该如何设计?)...假如我们现在是一个小创业公司(或者是一个 BAT 公司刚兴起的一个新部门),现在注册用户就 20 万,每天活跃用户就 1 万,每天单表数据量就 1000,然后高峰期每秒钟并发请求最多就 10 个。...我的天,就这种系统,随便找一个有几年工作经验的,然后带几个刚培训出来的,随便干干都可以。...因为每天多 10 万条数据,一个月就多 300 万条数据,现在咱们单表已经几百万数据了,马上就破千万了。但是勉强还能撑着。
可重复读(REPEATABLE READ) InnoDB的默认隔离等级。事务进行时,其它所有事务对其不可见,即多次执行读,得到的结果是一样的!...,如果一个查询关联了多张表,MySQL会为每张表分配一个连接缓冲,导致一个查询产生了多个连接缓冲; read_buffer_size #定义了当对一张MyISAM进行全表扫描时所分配读缓冲池大小,MySQL...查询的每个阶段所消耗的时间 2)performance_schema是5.5引入的一个性能分析引擎(5.5版本时期开销比较大) 启动监控和历史记录表:use performance_schema update...1)把一个实例中的多个数据库拆分到不同实例(集群) 拆分简单,不允许跨库。但并不能减少写负载。 2)把一个库中的表分离到不同的数据库中 该方式只能在一定时间内减少写压力。...3)数据库分片 对一个库中的相关表进行水平拆分到不同实例的数据库中: 如何选择分区键 分区键要能尽可能避免跨分区查询的发生 分区键要尽可能使各个分区中的数据平均 分片中如何生成全局唯一ID 可参考“
V8引擎就是为解决这一问题而生,在Node中也采用该引擎来解析JavaScript。 那么,V8是如何使得实现对JavaScript的解析,又是如何实现高性能的呢?...JavaScript对象在V8中的实现包含三个部分:隐藏类指针,这是v8为JavaScript对象创建的隐藏类;属性值表指针,指向该对象包含的属性值;元素表指针,指向该对象包含的属性。...当程序执行到new Date()这个地方,并未获取unknown这个变量的类型,V8只得将该部分代码进行回滚。 优化回滚是一个很耗时的操作,在写代码过程中,尽量不要触发优化该操作。...当一个过程需要很多内存,Zone将需要分配大量的内存,却又不能及时回收,会导致内存不足情况。 堆:管理JavaScript使用的数据、生成的代码、哈希表等。...,并实现它的虚函数—GetNativeFunction,根据参数name来决定返回实函数; 2.创建一个该子类的对象,并通过注册函数将该对象注册到V8引擎,当JavaScript调用’my’函数时就可被调用到
优化方式 优化数据库表结构的设计 表结构优化主要通过如下方式来优化: 字段的数据类型: 不同的数据类型的存储和检索方式不同,对应的性能也不同,所以说要合理的选用字段的数据类型。...表 的 存 储 引 擎 : 常 用 的 存 储 引 擎 有MyISAM、InnoDB、Memory,不同的存储引擎拥有不同的特性,所以要合理的利用每种存储引擎的长处和优点来提供数据的性能。...大表分表 大表是指一个表的数据量非常大,通常是指超过500亿条数据量,当一个表的数据量很大的时候,查询就变的很慢,所以减少表里的记录的数量是优化大表的一种方式,这种方式就是将一张表的数据拆分成多张表,这样每张表的数量就减少了...例如最大连接数默认为100,即使SQL语句优化的再好,硬件设备配置再高,当请求超过100时都要再等待,这就是配置不合理导致MySQL不能发挥它的最大能力。...升级服务器硬件 当所有优化手段都用了性能还需要优化时,那么只有升级MySQL服务器端硬件了,更快的磁盘IO设备,更强的CPU,更大的内存,更大的网卡流量(带宽)等。
当一个事务正在对一个表进行结构变更(如ALTER TABLE)或正在访问表的元数据(如查看表的列信息)时,MySQL会使用MDL来确保其他事务不能同时对该表进行结构变更或某些特定的数据操作。...例如,当一个事务正在向表中添加新列时,其他事务不能同时删除该列或对该表进行某些可能影响表结构的数据操作。...不同的连接算法适用于不同的场景和数据分布。 优化策略: 索引优化:确保连接条件上使用了合适的索引,可以大大减少扫描的数据量,提高连接效率。...当开启慢查询日志功能并设置合适的阈值时,MySQL会自动将执行时间超过该阈值的查询语句及其相关信息记录到日志文件中。...不可重复读:在同一个事务中多次读取同一份数据时,如果其他事务在此期间对该数据进行了修改并提交,那么第一个事务两次读取的结果可能会不同。
原理:weak对象会放入一个hash表中,用weak指向的对象内存地址作为key,因此该对象引用计数为0时就回dealloc,在hash表中找到所有以该对象内存地址为key的weak对象,从而置为nil...当weak引用指向的对象释放时,如何去处理weak指针的呢?...(1)、调⽤用objc_release (2)、因为对象的引⽤用计数为0,所以执行dealloc (3)、在dealloc中,调⽤用了了_objc_rootDealloc函数 (4)、在_objc_rootDealloc...从weak表中获取废弃对象的地址为键值的记录 b. 将包含在记录中的所有附有 weak修饰符变量量的地址,赋值为 nil c. 将weak表中该记录删除 d....编译通过,执行时才执行相应方法,即所谓的动态绑定。 @synthesize合成实例变量规则 a. 若指定了成员变量的名称,则会生成一个指定名称的成员变量 b.
简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。...3、幻像读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入操作(insert)的事务提交,导致每次返回不同的结果集。...下面分别介绍一下这些表的结构和内容: user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。 db权限表:记录各个帐号在各个数据库上的操作权限。...OPTIMIZE TABLE 用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收,使用了OPTIMIZE TABLE命令后这些空间将被回收,并且对磁盘上的数据行进行重排(...当这样的列赋给了小数点后面的位超过指定scale所允许的位的值,该值根据scale四舍五入。
JavaScript对象在V8中的实现包含三个部分: 隐藏类指针 - 这是v8为JavaScript对象创建的隐藏类; 属性值表指针 - 指向该对象包含的属性值; 元素表指针 - 指向该对象包含的属性。...2.在V8中,函数是一个基本单位,当某个JavaScript函数被调用时,V8会查找该函数是否已经生成本地代码,如果已经生成,则直接调用该函数。否则,V8引擎会生成属于该函数的本地代码。...隐藏类将对象划分成不同的组,对于组内对象拥有相同的属性名和属性值的情况,将这些组的属性名和对应的偏移位置保存在一个隐藏类中,组内所有对象共享该信息。同时,也可以识别属性不同的对象。...当一个过程需要很多内存,Zone将需要分配大量的内存,却又不能及时回收,会导致内存不足情况。 堆 - 管理JavaScript使用的数据、生成的代码、哈希表等。...,并实现它的虚函数—GetNativeFunction,根据参数name来决定返回实函数; 2.创建一个该子类的对象,并通过注册函数将该对象注册到V8引擎,当JavaScript调用’my’函数时就可被调用到
两张比较大的表进行 JOIN,但是没有给表的相应字段加索引 表存在索引,但是查询的条件过多,且字段顺序与索引顺序不一致 对很多查询结果进行 GROUPBY 索引 创 建 索 引 的 目 的 就...表 示 唯 一 的 , 不 允 许 重 复 的 索 引 , 支 持 单 列 和 多 列 。...如果没有,则该列含有 NO -- Index_type:索引类型(BTREE, FULLTEXT, HASH, RTREE)。...B+ 树 B+树是 B 树的一种变体,同样是多路平衡查找树,它与 B 树主要的不同是 非叶子节点不存储数据,只存储索引 叶子节点包含了全部的关键字信息,且叶子节点按照关键字顺序相互连接...使用场景不同,这个值也很难确定,一般需要 join 的字段我们都要求是 0.1 以上,即平均 1 条扫描 10 条记录; 4.
如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导致服务不可用。 慢查询的确会导致很多问题,我们要如何优化慢查询呢?...当EXPLAIN与可解释的语句一起使用时,MySQL将显示来自优化器的有关语句执行计划的信息。也就是说,MySQL解释了它将如何处理该语句,包括有关如何连接表以及以何种顺序连接表的信息。...当EXPLAIN与非可解释的语句一起使用时,它将显示在命名连接中执行的语句的执行计划。 对于SELECT语句, EXPLAIN可以显示的其他执行计划的警告信息。...:子查询的结果,其id值为N partitions列 该列的值表示查询将从中匹配记录的分区 type列 该列的值表示连接类型,是查看索引执行情况的一个重要指标。...在这种情况下,您可以通过检查该WHERE 子句以检查它是否引用了某些适合索引的列,从而提高查询性能。 key列 该列表示实际用到的索引。
在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种 6、视图 视图是数据库数据的特定子集。...一般来说,应该在这些列 上创建索引,例如: 在经常需要搜索的列上,可以加快搜索的速度; 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 在经常用在连接的列上,这 些列主要是一些外键...第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 第四,当修改性能远远大于检索性能时,不应该创建索 引。...3、非重复读(nonrepeatableread):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。...4、幻像(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。
通过修改间接表,可以给不同的队列分配不同的相对权重。 RSS IRQ 配置 每个接收队列都会关联一个IRQ(中断请求)。当给定的队列接收到新的报文后,NIC会触发中断,通知CPU。...建议配置 流控制在系统上有很多并行流时有用,如果单个连接占用了CPU的50%,则表明存在问题。...上图展示了RFS是如何工作的。内核获取一个蓝色的报文,属于蓝色的流。...如TCP,当确认一个连接上的所有数据后就会设置该标志。 XPS配置 只有在内核启用了CONFIG_XPS 符号时才能使用XPS功能。...更多信息 RPS 和RFS是内核2.6.35引入的,XPS是2.6.38引入的。 加速RFS是2.6.35引入的。
也就是意味着执行目标SQL所需要IO,CPU等资源的一个估计值。而成本值是根据索引,表,行的统计信息计算出来的。...,当捕捉到到一个SQL语句的时候通过什么方式优化。...也就是说,MySQL解释了它将如何处理这条语句,包括有关表如何连接和以何种顺序连接的信息,EXPLAIN会展示预执行计划信息....MySQL慢日志 最普遍常用的方式,当语句执行时间较长时,通过日志的方式进行记录,这种方式就是慢查询的日志。...第三部分:每一个sql具体的分析 如何通过pt-query-digest 慢查询日志发现有问题的sql 查询次数多且每次查询占用时间长的sql 通常为pt-query-digest分析的前几个查询 IO
如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导致服务不可用。 慢查询的确会导致很多问题,我们要如何优化慢查询呢?...当EXPLAIN与可解释的语句一起使用时,MySQL将显示来自优化器的有关语句执行计划的信息。也就是说,MySQL解释了它将如何处理该语句,包括有关如何连接表以及以何种顺序连接表的信息。...当EXPLAIN与非可解释的语句一起使用时,它将显示在命名连接中执行的语句的执行计划。 对于SELECT语句, EXPLAIN可以显示的其他执行计划的警告信息。...:子查询的结果,其id值为N partitions列 该列的值表示查询将从中匹配记录的分区 type列 该列的值表示连接类型,是查看索引执行情况的一个重要指标。...code字段上面建了一个普通索引: 下面逐一看看常见的几个连接类型是怎么出现的: system 这种类型要求数据库表中只有一条数据,是const类型的一个特例,一般情况下是不会出现的。
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。 脏读 :表示一个事务能够读取另一个事务中还未提交的数据。...比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。 不可重复读 :是指在一个事务内,多次读同一数据。 幻读 :指同一个事务内多次查询返回的结果集不一样。...但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。...因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。...不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。
JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。...**LEFT JOIN(左连接):**获取左表所有记录,即使右表没有对应匹配的记录。...---- 2、MySQL NULL 值处理 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作...SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常; ROLLBACK TO identifier 把事务回滚到标记点; SET TRANSACTION...如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段: mysql> ALTER TABLE testalter_tbl DROP i; 如果数据表中只剩余一个字段则无法使用
领取专属 10元无门槛券
手把手带您无忧上云