0%

为什么要使用线程池

  • 线程池提供了一种限制和管理资源
  • 好处:
    • 降低资源消耗:线程的创建和销毁需要消耗资源
    • 提高响应速度:当任务达到的时候,任务可以不用等待线程创建就能立即执行
    • 提高线程的可管理性:线程是稀缺资源,不可以无限创建,需要统一分配和调度、监控

如何创建线程池

阅读全文 »

1 Sharding

把数据库横向扩展到多个物理节点的一种有效方式,主要是为了突破数据库单机服务器的 I/O 瓶颈,解决数据库扩展问题。

Sharding可简单定义为将大数据库分布到多个物理节点上的一个分区方案。每一个分区包含数据库的某一部分,称为一个shard,分区方式可以是任意的,并不局限于传统的水平分区和垂直分区。 一个shard可以包含多个表的内容甚至可以包含多个数据库实例中的内容。每个shard被放置在一个数据库服务器上。一个数据库服务器可以处理一个或多个shard的数据。系统中需要有服务器进行查询路由转发,负责将查询转发到包含该查询所访问数据的shard或shards节点上去执行。

阅读全文 »

什么是锁

锁类型

  • 基于锁的属性分类:共享锁、排他锁。
  • 基于锁的粒度分类:表锁、行锁、记录锁、间隙锁、临键锁。
  • 基于锁的状态分类:意向共享锁、意向排它锁。
阅读全文 »

日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括redo logundo log),本文接下来会详细介绍这三种日志。

错误日志

错误日志文件对MySQL的启动,运行,关闭过程进行了记录。

阅读全文 »

测试数据创建

创建数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- 创表
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
NAME varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`NAME`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

create table `t_user_balance` (
`id` int(11) NOT NULL AUTO_INCREMENT,
uid int(11) NOT NULL,
balance int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_uid` (`uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- 插入数据
insert into t_user values(1,'yangl');
insert into t_user values(2,'zhangsan');
insert into t_user values(3,'lisi');
insert into t_user values(4,'wangwu');

insert into t_user_balance values(1, 1, 100);
insert into t_user_balance values(2, 2, 200);
insert into t_user_balance values(3, 3, 300);
insert into t_user_balance values(4, 4, 400);
阅读全文 »

索引概述

定义

索引是存储引擎用于快速找到记录的一种数据结构

阅读全文 »

为什么要事务

一个数据库事务通常包含对数据库进行读或写的一个操作序列。它的存在包含有以下两个目的:

  • 为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库在异常状态下仍能保持一致性的方法。

  • 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,保证彼此的操作互相干扰。

阅读全文 »

编写语句顺序

1
2
3
4
5
6
7
8
9
10
11
(8)  SELECT 
(9) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON<join_condition>
(4) WHERE<where_condition>
(5) GROUP BY<group_by_list>
(6) WITH {CUBE|ROLLUP}
(7) HAVING<having_condition>
(10) ORDER BY<order_by_list>
(11) LIMIT<limit_number>

实际查询顺序

阅读全文 »

SQL语句执行过程详解

当向 MySQL 发送一个请求的时候,MySQL 到底做了什么:

  1. 客户端发送一条查询给 MySQL 服务器。
  2. MySQL 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。
  3. MySQL 服务器端进行 SQL 解析、预处理,再由优化器生成对应的执行计划。
  4. MySQL 根据优化器生成的执行计划,再调用存储引擎的 API 来执行查询。
  5. 将结果返回给客户端。
阅读全文 »