文章目录

  • 1、MySQL的架构:
    • 1.Server 层
    • 2.存储引擎层
      • InnoDB和MyISAM比较
    • 3、锁及粒度
    • 4、InnoDB MVCC
    • 5、关系型数据库和非关系型数据库
  • 2、基础语句
    • 1、创建与删除数据库 / 表
    • 2、键
    • 3、基本数据类型
    • 4、数据行的增删改查操作
    • 5、分页
    • 6、排序
    • 7、分组
      • count(1)、count(*)与count(列名)
    • 8、连表
  • 3、索引
    • 1)优点
    • 2)缺点
    • 3)建立索引的原则
    • 1)从逻辑上分类
    • 2)从物理存储上分类:聚集索引、非聚集索引
    • 3)从数据结构分类:Hash索引、B+树索引
      • 1)B+树索引
        • B+树在MyISAM索引和InnoDB中实现的区别
      • 2) 哈希索引
      • 3)B+树索引和hash索引比较
      • 4)B+ 树和 B 树比较
    • 4)命中索引
  • 4、事务
    • 1、事务的作用
    • 2、事务的特性(ACID特性)
    • 3、事务并发导致的问题
    • 4、事务的隔离性
    • 5、InnoDB对死锁的处理
  • 5、视图
  • 6、触发器
  • 7、函数
  • 8、存储过程
  • 9、动态执行SQL
  • 10、SQL优化
    • 1、一条SQL语句在数据库框架中的执行流程
    • 2、MySQL问题排查的手段
    • 3、查询性能的优化方法
    • 4、对数据库作优化
    • 5、MySQL数据库CPU飙升到500%怎么处理
  • 11、数据库的数据存放方法
  • /2、数据库连接泄露的含义
  • 13、水平切分和垂直切分

Python开发【第十七篇】:MySQL(一)

Python开发【第十八篇】:MySQL(二)

Python开发【第十九篇】:Python操作MySQL

1、MySQL的架构:

MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。

数据库的三范式:

  • 强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项

  • 要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。

  • 任何非主属性不依赖于其它非主属性。

分为Server和存储引擎两部分。

1.Server 层

  1. Server 层包括:
    连接器、查询缓存、分析器、优化器、执行器等,涵盖了 MySQL的大多数核心服务功能,以及所有的内置函数(如:日期、时间、数学和加密函数等)

  2. 所有跨存储引擎的功能都在这一层实现,比如:存储过程、触发器、视图等。

2.存储引擎层

  1. 存储引擎层负责:数据的存储和提取。

  2. 其架构是插件式的,支持 InnoDB、MyISAM 等多个存储引擎。

  3. 从 MySQL5.5.5 版本开始默认的是InnoDB,但是在建表时可以通过 engine = MyISAM来指定存储引擎。不同存储引擎的表数据存取方式不同,支持的功能也不同。

  4. 不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。

InnoDB和MyISAM比较

InnoDB:

  • 最为通用 / 推荐的一种引擎,

  • 支持事务、行级锁、表锁甚至间隙锁(避免幻读)

  • 支持热备份,支持MVCC,支持外键,

  • 支持B+树索引和自适应哈希索引

  • InnoDB5.6之前不支持全文索引

  • 在并发上占优势,原始数据存储,系统资源占用多。

  • 关于count(),InnoDB不会直接存储总行数,需要按行扫描。

MyISAM:

  • 默认的存储引擎,

  • 支持全文索引,支持表锁

  • 只支持B+树索引

  • 不支持事务和行级锁,不支持MVCC,不支持外键

  • 实现了前缀压缩技术,系统资源占用少(但会影响查找),查询速度上完胜(大概是InnoDB的3倍)。

  • count():MyISAM会直接存储总行数

PS:大部分情况下,InnoDB都是正确的选择。

3、锁及粒度

1、共享锁/读锁:

  • 互不阻塞,优先级低

2、排他锁/写锁:

  • 阻塞其他锁,优先级高,即确保在一个事务写入时不受其他事务的影响。

3、锁粒度:

  • 锁定的数据量越少(粒度越小),并发程度越高,但相应的加锁、检测锁、释放锁用的系统开销也随之增大。

4、锁策略:锁开销与数据安全性之间的平衡

1)表锁:

  • 锁住整张表,读锁互不阻塞,写锁阻塞其他所有读写锁(同一张表)

  • 开销最小,加锁快,不会出现死锁。

  • 锁定粒度大,发生锁冲突的概率最高,并发量最低。

2)行级锁:

  • 对每一行数据(记录)加锁。

  • 开销大,加锁慢,会出现死锁。

  • 锁力度小,发生锁冲突的概率小,并发度最高。

5)InnoDB存储引擎的锁的算法

  • Record lock:单个行记录上的锁;

  • Gap lock:间隙锁,锁定一个范围,不包括记录本身;

  • Next-key lock:record + gap 锁定一个范围,包含记录本身。

4、InnoDB MVCC

多版本并发控制,是为了避免加锁而实现的。

一般的实现方法是存储快照来实现的。

InnoDB实现方式:

  • 在记录后添加两个隐藏列(表项),分别是事务创建时间、过期时间,存储的实际上是系统版本号(系统版本号随着事务的创建而递增)。

  • 即 insert 时加上开始版本号,update / delete时加上过期版本号,在 select 时,只访问开始系统版本号小于当前的事务的版本号、过期时间要么未定义要么在当前版本号之后的记

  • 这样就可以保证:访问的记录是在本事务开始前就存在而且在本事务期间没有过期(被删除或被修改过的)。

5、关系型数据库和非关系型数据库

1)关系型数据库:

  • 指采用了关系模型来组织数据的数据库。

  • 关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织

关系模型中常用的概念:

  • 关系:一张二维表,每个关系都具有一个关系名,也就是表名

  • 元组:二维表中的一行,在数据库中被称为记录

  • 属性:二维表中的一列,在数据库中被称为字段

  • 域:属性的取值范围,也就是数据库中某一列的取值限制

  • 关键字:一组可以唯一标识元组的属性,数据库中常称为主键,由一个或多个列组成

  • 关系模式:指对关系的描述。其格式为:关系名(属性1,属性2, … … ,属性N),在数据库中成为表结构

当今十大主流的关系型数据库:

  • Oracle,Microsoft SQL Server,MySQL,PostgreSQL,DB2, Microsoft Access,SQLite,Teradata,MariaDB(MySQL的一个分支),SAP

2)非关系型数据库

  • 指非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。

  • 非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。

2、基础语句

1、创建与删除数据库 / 表

数据库:

create database 数据库名称 charset=utf8
drop database 数据库名称

数据表:

 create table table_name(id int not null auto_increment primary key   name char(10)    --10代表10个字符department_id intconstraint 外键名称 foreign key(department_id) references 另外一张表的表名(列名)unique 唯一索引的名称(列名,列名)   --不能重复,可以为空                )engine=innodb   default charset=utf8;

2、键

1)主键

  • 主键不可以为空,一张表只能有一个主键,一个主键不一定只有一列

  • 当使用两列做主键时:primary key(列名,列名)即可,注意:这两列都要not null

  • 不建议使用过长的字段作为主键
    因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

  • 在InnoDB中不要用非单调的字段作为主键。
    因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

  • 主键是能确定一条记录的唯一标识,比如,一条记录包括身份证号,姓名,年龄,身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

InnoDB为什么要用自增id作为主键

  • 如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。

  • 如果使用非自增主键(比如身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过优化表(optimize table)来重建表并优化填充页面。

  • 因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

2)外键

  • 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。

  • 外键的名字不可以重复,外键可以节省空间,可以起到约束的作用

  • 外键:一对一,一对多,多对多

  • 当外键关联的表中使用两列做主键时,外键sql语句中references后面可以使用这两个列名

constraint 外键名称 foreign key(department_id)
references 另外一张表的表名(列名,列名)

对于自增:

desc tb1;  --查看表tb1中数据的字段类型、是否为空等
show create table tb1;  --查看表tb1是怎么创建的,横着显示结果
show create table tb1 \G;  --查看表tb1是怎么创建的, 竖着显示结果
alter table tb1  AUTO_INCREMENT=2  --用于修改自增列的起始值为2show session variable like 'auto_inc'   --查看变量
set session auto_increment_increment=2  --用于改变会话中的自增的步长,不影响其他会话中的步长
set session auto_increment_offset=2  --用于改变会话中的自增的起始值show global variable like 'auto_inc'   --查看变量
set global auto_increment_increment=2  --用于改变全局的自增的步长,任意会话中的步长都被变化
set global auto_increment_offset=2  --用于改变全局的自增的起始值

3、基本数据类型

1)数字:

  • 整数: tinyint(范围小)、int(范围稍大)、bigint(范围更大)

  • 小数:double(不精准)、float(不精准)、decimal(精准)

  • decimal(10,5) # 总共保留10位,其中小数点后保留5位

2)字符:

  • char:定长、查找速度更快

  • varchar:不定长,最多255

  • text:不定长,大于255时用

非常大时写成文件保存在硬盘上,把路径写入数据库(照片也是)

创建数据表时,把定长的往前放置,则查询速度会相对快一些

char和varchar的区别:

1.char(n)

  • char类型是定长的类型

  • 当定义的是char(10),输入的是"abc"这三个字符时,它们占的空间一样是10个字节,包括7个空字节。效率高,但占用空间。

  • 当输入的字符长度超过指定的数时,char会截取超出的字符。

  • 当存储char值时,MySQL自动删除输入字符串末尾的空格。

  • 取数据的时候,char类型的要用trim()去掉多余的空格,varchar不需要。

  • char适合存储很短的、一般固定长度的字符串。
    对于非常短的列,char比varchar在存储空间上更有效率。

2.varchar(n)类型

  • varchar(n)类型用于存储长度为 n 个字节的、可变长度的、非Unicode的字符数据。
    n必须是介于1和8000之间的数值,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。

  • varchar需要使用1或2个额外字节记录字符串的长度,如果列的最大长度小于等于255字节(是定义的最长长度,不是实际长度),则使用1个字节表示长度,否则使用2个字节来表示。

  • varchar(10)中10 的含义是最多存放 10 个字符,当输入abc三个字符时,那么实际存储大小为3个字节。

  • varchar(10) 和 varchar(20) 存储 hello 所占空间一样,但后者在排序时会消耗更多内存,因为 order by col 采用 fixed_length 计算 col 长度。

  • 取数据的时候,varchar不需要去掉多余的空格。

3)时间类型:datetime(最常用,年月日时分秒)

4)二进制类型

  • 枚举:enum(),选项固定且不常修改时候用,只能选其中一个选项

  • 集合:set(),几个选项组合起来用

size enum('1','2','3')  --选择size,1,2,3中选一个
col set('a','b','c')  # 选择col,a,b,c中选,可以选多个

4、数据行的增删改查操作

增:

insert into table_name1(name, age) values('alex',18),('alex1',19);--把tb2中的数据插入到tb1中
insert into table_name1(name, age)  select name,age from table_name2;  

删:

delete from table_name --删除了之后自增列会在原来的基础上继续增加,不会从0重新开始truncate table table_name  --删除了之后自增列从0开始
delete from table_name where id > 10  --删除指定列
delete from table_name where id > 10  or name='alex'  --删除指定列

改:

update table_name set name='root' where id > 10
update table_name set name='root' where id > 10  and name='alex'

查:

select * from table_name;
select id,name from table_name;
select id,name as A from table_name where id > 10 or name='alex';
--将name列的列名改为Aselect id,name as A, 1 from table_name where id > 10 or name='alex';
-- 多加了一列,该列的值全为1select id,name from table_name where id != 10; --不等于10
select id,name from table_name where id <> 10;  --不等于10
select id,name from table_name where id in (1,3,5);
select id,name from table_name where id not in (1,3,5);
select id,name from table_name where id between 5 and 10;  --闭区间select id,name from table_name where id in (select id from tb2);'''通配符''':
select id,name from table_name where name like 'a%' ;  --以a开头的字符串
select id,name from table_name where name like 'a_';  -- 以a开头的字符串
select id,name from table_name where name name like '%a' ;  --以a结尾的字符串'''聚合函数'''
select count as totalcount from table1
select sum(field1) as sumvalue from table1
select avg(field1) as avgvalue from table1
select max(field1) as maxvalue from table1
select min(field1) as minvalue from table1

5、分页

问题:

  • 数据越多,速度越慢

解决:

  • 索引表中扫:不会快很多
  • 记录当前页最大或者最小ID
select * from table_name limit 10;   --查看前10条数据select * from table_name limit 10, 5;   --从10开始查看后面5条数据select * from table_name limit 10 offset 5;   --从5开始查看后面10条数据'''页面只有上一页,下一页:max_id, min_id'''
select * from table_name where id > max_id limit 10 -- 下一页select * from table_name where id < min_id order by desc limit 10  --上一页''' 上一页 192  193 [196] 197 198 199 下一页'''
select * from table_name where id in ( select id from (select id from table_name where id > max_id limit 30) as N  order by N.id desc limit 10)

6、排序

select * from table_name order by id desc;  --根据id降序排列select * from table_name order by id asc;   --根据id升序排列    select * from table1 order by field1,field2 [desc] select * from table_name order by id desc limit 10;  --查看后10条数据

7、分组

select count(id),part_id from table_name group by part_id  --根据part_id分组select count(id) as A,part_id from table_name group by part_id  --改列名

聚合函数:

  • count()
    求行的个数用累计count
    Count(*)包括了所有的列,在统计结果的时候不会忽略列值为null的计数;
    Count(列名)只包括列名那一项,会忽略列值为空的计数。

  • sum()
    求和用累加sum()

  • max()

  • min()

  • avg()

对聚合函数结果进行二次筛选时,要用having

where条件后面不能出现聚合函数的结果:即:

  • 在where id>0 的位置不能出现类似于count(id)

group by可以达到去重的效果
distinct去重,但是效率不高:

select count(id), part_id from table_name group by part_id having count(id)>1select count(id),part_id from table_name where id>0 group by part_id having count(id)>1select distinct id from table_name where id>0

count(1)、count(*)与count(列名)

count(1)、count(*)与count(列名)的执行区别

1)count(1) and count(*)

  • 当表的数据量大些时,对表作分析之后,使用count(1) 比使用count( * )用时多

  • 从执行计划来看,count(1)和count( * )的效果是一样的。
    但是在表做过分析之后,count(1)会比count( * )的用时少些(1w以内数据量),不过差不了多少。

2)count(1)、count(*)与count(列名)

执行效果上:

  • count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL

  • count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL

  • count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。

执行效率上:

  • 列名为主键,count(列名)会比count(1)快

  • 列名不为主键,count(1)会比count(列名)快

  • 如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)

  • 如果有主键,则 select count(主键)的执行效率是最优的

  • 如果表只有一个字段,则 select count(*)最优。

8、连表

假设有2个表-Student表和SC表(选课表):

  • 内连接:当使用内连接时,如果Student中某些学生没有选课,则在SC中没有相应元组,最终查询结果舍弃了这些学生的信息

  • 外连接:如果想以Student表为主体列出每个学生的基本情况及其选课情况。即使某个学生没有选课,依然在查询结果中显示(SC表的属性上填空值),就需要使用外连接

1)left join

  • 前面的表在左边,左边表的数据会全部显示

  • 如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为null。

  • 使用场景:可以保持左表完整加入另一表中的数据

2)right join

  • 前面的表在右边,即右边表的数据会全部显示,

3)inner join

  • 不显示有null值的行,即内连接

4)union和union

  • 上下连表union会自动去重,union all显示全部的数据
 select * from table_name1, table_name2   --会出现笛卡尔积 假如tb1、tb2中分别有3条数据,则该语句执行后结果中会有9条数据--内连接
select * from table_name1,table_name2  where table_name1.id = table_name2.id--内连接
select * from table_name1 inner join table_name2 on table_name1.id = table_name2.idselect * from table_name1 left join table_name2 on table_name1.id = table_name2.idselect * from table_name1 right join table_name2 on table_name1.id = table_name2.id--上下连表
select sid, sname from table_name1  union/union all select num , sname from table_name2
(select * from tb where id>10) as A  --临时表select id,name,1,sum(x)/count()  --指定映射case when id>8 then xx1 else xx2 end   --条件运算,如果id>8 取xx1,否则取xx2if(isnull(xx), 0, 1)  --三元运算,如果为空,取0,否则取1

3、索引

索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

索引的出现是为了提高数据的查询效率,对于数据库的表而言,就像书的目录一样。

1)优点

  • 对数据库表列进行增加恰当索引,可以快速的找到匹配的记录行数,相比于默认的全表扫描,可以大大加快查找的速度。 查询快,插入、更新、删除慢。
    无索引时:从前往后依次查找

  • 添加索引可以起到约束的作用,比如通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

  • 帮助服务器避免排序和临时表。将随机IO变为顺序IO。
    可以加强表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

2)缺点

  • 创建索引和维护索引需要消耗时间,这个时间随着数据量的增加而增加;需要额外的文件保存特殊的数据结构

  • 索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;

  • 当对表进行增、删、改的时候索引也要动态维护,降低了数据的维护速度。

3)建立索引的原则

1.在最频繁使用的、用以缩小查询范围的字段上建立索引;

2.在频繁使用的、需要排序的字段上建立索引。

3.最左前缀匹配原则:

  • mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,
  • 比如a =1 and b=2 and c> 3 and d = 4
    如果建立(a,b,c,d)顺序的索引,d是用不到索引的,
    如果建立(a,b,d,c)的索引则都可以用到, a,b,d的顺序可以任意调整。

4.索引列不能参与计算,保持列“干净”

5.尽量选择区分度高的列作为索引,

  • 区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,
  • 比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,
  • 那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录

6.尽量的扩展索引,不要新建索引。

  • 比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

不适合建立索引的情况:

  • 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引;

  • 对于一些特殊的数据类型,不宜建立索引。

  • 对于经常存取的列避免建立索引;

1)从逻辑上分类

1)普通索引

2)主键索引

3)唯一索引

4)联合索引:

  • 联合主键索引
  • 联合唯一索引
  • 联合普通索引
  • 联合索引遵循最左前缀匹配原则

5) 全文索引

索引合并:把多个索引合并使用

组合索引的效率>索引合并

覆盖索引:

  • 如果一个索引包含了满足查询语句中字段与条件的数据就叫做覆盖索引,即可以在索引文件中直接获取数据

覆盖索引的优点:

  • 索引通常远小于数据行的大小,只读取索引能大大减少数据访问量;

  • 一些存储引擎在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用。

  • 对于InnoDB引擎,若辅助索引能够覆盖查询,则无需访问主索引。

建立索引:key 'idx_age_name_sex' ('age','name','sex')A:select * from student where age = 16 and name = '小张'B:select * from student where name = '小张' and sex = '男'C:select * from student where name = '小张' and sex = '男' and age = 18D:select * from student where age > 20 and name = '小张'E:select * from student where age != 15 and name = '小张'F:select * from student where age = 15 and name != '小张'分析:
A遵从最左匹配原则,age是在最左边,所以A走索引;B直接从name开始,没有遵从最左匹配原则,所以不走索引;C虽然从name开始,但是有索引最左边的age,mysql内部会自动转成where age = '18' and name = '小张'  and sex = '男' 这种,所以还是遵从最左匹配原则;D这个是因为age>20是范围,范围字段会结束索引对范围后面索引字段的使用,所以只有走了age这个索引;E这个虽然遵循最左匹配原则,但是不走索引,因为!= 不走索引;F这个只走age索引,不走name索引,原因如上;

2)从物理存储上分类:聚集索引、非聚集索引

从物理存储上可以分为聚集索引、非聚集索引。

聚簇索引

  • 对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。

  • 聚集索引中键值的逻辑顺序决定了表中相应行的物理顺序。

  • SQL Sever默认主键为聚集索引,也可以指定为非聚集索引。MySQL里主键就是聚集索引。如果不创建索引,系统会自动创建一个隐含列作为表的聚集索引。

  • 由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。

  • 聚集索引类似于电话簿,后者按姓氏排列数据。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。

聚簇索引与非聚簇索引区别:

  • 聚簇索引的叶子结点就是数据节点,而非聚簇索引的叶子结点仍然是索引节点,只不过有指向对应数据块的指针。

  • MyISAM中的B+tree索引是非聚集索引,InnoDB中的B+tree索引是聚集索引

应用:

  • 聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。
  • 如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。
  • 当索引值唯一时,使用聚集索引查找特定的行也很有效率。

例如:如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。

例如:使用唯一雇员ID 列 emp_id 查找特定雇员的最快速的方法,是在 emp_id 列上创建聚集索引或 PRIMARY KEY 约束。

3)从数据结构分类:Hash索引、B+树索引

索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引、B+树索引等。

InnoDB存储引擎的默认索引实现为B+树索引。

BTree和B+Tree

1)B+树索引

  • B+树是基于 B 树和叶子节点顺序访问指针进行实现的,它具有 B 树的平衡性,并且通过顺序访问指针来提高区间查询的性能;

  • 在 B+ 树中,其非叶子节点均为key值,叶子节点是key-data键值对。叶子节点前后相连且有序。
    一个节点中的 key 从左到右非递减排列,即如果某个指针的左右相邻 key 都不为 null的话,则该指针指向节点的key大于等于左边的key且小于等于右边的key。

  • 进行查找操作时,首先在根节点进行二分查找,找到一个 key 所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出 key 所对应的 data;

  • 插入、删除操作会破坏平衡树的平衡性,因此在插入删除操作之后,需要对树进行一个分裂、合并、旋转等操作来维护平衡性。

B+树在MyISAM索引和InnoDB中实现的区别

B+树在MyISAM索引实现:

  • 叶节点的data域存放的是数据记录的地址

  • MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

  • 下图中col2 为索引列

B+树在InnoDB索引实现:

  • 下图中col1 为索引列,比如数据15的data域中的34、Bob为对应行中的col2和col3的数据,同MyISAM中的表


区别:

1) InnoDB的数据文件本身就是索引文件。MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。

  • 在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

  • InnoDB叶节点包含了完整的数据记录。

  • 这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

2)InnoDB的辅助索引data域存储相应记录主键的值,MyISAM中存的是地址。

即InnoDB的所有辅助索引都引用主键作为data域。比如:

聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:

  • 首先检索辅助索引获得主键,

  • 然后用主键到主索引中检索获得记录。

2) 哈希索引

  • 通过对 key 进行 hash 而将其记录存储在不同的bucket(桶)中,可以做到常数时间的查找,即哈希索引能以 O(1) 时间进行查找。但是失去了有序性。

  • 无法用于排序与分组、只支持精确查找,无法用于部分查找和范围查找。单值快,范围查找慢

  • 要注意哈希冲突的避免(链表法、线性探测、二次探测、公共溢出区的方法)。其中MD5128位,和sha1/256码都较长不太适合作为hash函数。

InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引”,

  • 当某个索引值被使用的非常频繁时,会在 B+ 树索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如:快速的哈希查找。

3)B+树索引和hash索引比较

  • B+树默认有序,hash默认无序,所以哈希索引无法用于排序;

  • 哈希索引O(1)在速度上毋庸置疑要快于B+树近似O(logn);

  • 哈希索引只能进行等值查询(因为他要计算hash(key)再去匹配)而B+树索引可以进行等值、部分前缀、范围查询;

  • 底层实现结构不同:B+树是非线性结构,hash桶是线性结构。

对于某些场景如热点页/活跃查询页,需要借助哈希索引来实现快速查询。

4)B+ 树和 B 树比较

一颗m阶的B+树和m阶的B树的差异在于:

  1. 非叶子结点的子树指针与关键字个数相同;

  2. 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间)

  3. 为所有叶子结点增加一个链指针。图中Q是通过指针连在一起的。

  4. 所有关键字都在叶子结点出现。(5 8 9 10 15 18 20 26 …等等)叶子结点相当于是存储(关键字)数据的数据层;

  5. B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中)

  6. 所有的非终端结点可以看成是索引部分,结点中的关键字是有其孩子指向的子树中最大(或最小)关键字。比如第二层5,它的子树为5、8、9 (而B 树的非终节点也包含需要查找的有效信息)

为什么InnoDB存储引擎选用B+树而不是B树

1)B+树的磁盘读写代价更低

  • 文件与数据库都是需要较大的存储,也就是说,它们都不可能全部存储在内存中,故需要存储到磁盘上。而所谓索引,则为了数据的快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数,因此B+树相比B树更为合适。

  • B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

  • B 树的每个节点都存储数据,而 B+ 树只有叶子节点才存储数据,所以查找相同数据量的情况下,B 树的高度更高,IO 更频繁。

2)B+树的查询效率更加稳定

  • 由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。B+树所有关键字查询的路径长度相同,因此每一个数据的查询效率相当。
  • B树有可能在中间节点找到数据,稳定性不够。

3、B+树更加适合在区间查询的情况

  • 由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,

  • B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,

  • 所以B+树更加适合在区间查询的情况,在数据库中基于范围的查询是非常频繁的,所以通常B+树用于数据库索引。

select * from tb where name='asdf'
--创建普通索引:
create index 索引名称 on table_name(列名)
drop index 索引名称 on table_name--创建唯一索引:
create unique index 索引名称 on table_name(列名)--创建主键索引:
alter table table_name add primary key(列名)--创建联合索引:
create index 索引名称 on table_name(列名,列名)  '''创建表后添加聚集索引'''
--SQL Server:
create clustered index clustered_index
on table_name(colum_name)--mysql:
alter table table_name
add primary key(colum_name)

4)命中索引

什么是数据库索引

  1. 模糊查询,like ‘%x’ 不走索引,'x%'走索引

  2. 对索引列使用函数,不走索引

  3. 类型不一致,比如字符串和数字进行比较

  4. 当索引列参与表达式计算时不使用索引

  5. 正则表达式不使用索引

  6. or:当 or 条件中有未建立索引的列时会失效,当使用or条件时,要求使用的所有字段都必须建立索引,

  7. !=: 不走索引,特殊情况:如果是主键,还是会走索引

  8. 有 > 时 :不走索引,特殊情况:如果是主键或索引是整数类型,还是会走索引

  9. order by:当根据索引排序时候,选择的映射如果不是索引,则不走索引,特殊情况:如果对主键排序,还是会走索引

  10. MySQL内部优化器会对SQL语句进行优化,如果优化器估计使用全表扫描比使用索引快,则不使用索引。

--建立两个索引
key 'idx_age' ('age'),
key 'idx_name' ('name')--A走索引,B不走索引
A:select * from student where 'name' like '王%'
B:select * from student where 'name' like '%小'--A走索引,B不走索引
A:select * from student where age = 10+8
B:select * from student where age + 8 = 18--A走索引,B不走索引
A:select * from student where  concat('name','哈') ='王哈哈';
B:select * from student where name = concat('王哈','哈');-- 索引列用了!= 不走索引
select * from student where age != 18

怎么知道创建的索引有没有被使用到?

使用 Explain 命令来查看语句的执行计划,MySQL 在执行某个语句之前,会将该语句过一遍查询优化器,之后会拿到对语句的分析,也就是执行计划,其中包含了许多信息。可以通过其中和索引有关的信息来分析是否命中了索引,例如:possilbe_key、key、key_len 等字段,分别说明了此语句可能会使用的索引、实际使用的索引以及使用的索引长度。

4、事务

  • 是指作为单个逻辑工作单元执行的一系列操作(SQL语句)。这些操作要么全部执行,要么全部不执行。

  • 数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。一个数据库事务通常包含了一个序列的对数据库的读/写操作。

  • 通常认为:事务仅仅与数据库相关,事务是为解决数据安全操作提出的,事务控制就是控制数据的安全访问(例如转账业务)

  • mysql里只有innodb和NDB支持事务

1、事务的作用

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

  2. 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
    当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;
    同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

2、事务的特性(ACID特性)

  • 原子性(Atomicity):
    事务作为一个整体被执行,其中的SQL操作要么全部提交成功commit,要么全部失败回滚rollback,不可分割;

  • 原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)

  • 一致性(Consistency):
    事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

  • 隔离性(Isolation):
    多个事务并发执行时,事务之间彼此互不影响,一个事务在提交之前,对其他事务是不可见的。
    普通select用MVCC实现,更新、删除、插入操作会用LBCC(枷锁)实现

  • 持久性(Durability):
    一个事务一旦提交成功,他所做的修改就会永久性的存储在数据库中。
    崩溃恢复用redolog和双写缓冲double buffer write

3、事务并发导致的问题

本质就是读一致性和写一致性问题

  • 读一致性问题:脏读、不可重复读、幻读

  • 写一致性问题:脏写、丢失更新

脏写:

  • 一个事务修改了其他事务未提交的数据,其他事务回滚了,此时由于undo log日志中存放的是一开始的数据记录,那么其他事务回滚之后就会把这条数据回滚为最初的数据值,导致这个事务的修改无效。

丢失更新:

  • 最后的更新覆盖了其他事务之前的更新,而事务之间并不知道,发生更新丢失。更新丢失,可以完全避免,应用对访问的数据加锁即可。

脏读:

  • 一个事务读取另外一个事务修改、但是尚未提交的数据,造成两个事务得到的数据不一致。

  • 例如事务A正在访问数据,并且对数据进行了修改,更改了一行数据,这种修改还没有提交到数据库中。而事务B在事务A提交更新之前读取了已更新的行,然后使用了这个数据。
    如果事务A回滚该更新,则事务B使用的这个数据由于还没有提交,就会被认为是不曾存在的数据,即为脏数据,根据脏数据所做的操作可能是不正确的。

幻读:

  • 在同一个事务中,当同一查询多次执行的时候,由于其他插入操作的事务提交,会导致每次返回不同的结果集。

  • 幻读是事务非独立执行时候发生的一种现象。

  • 比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。

  • 发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了

不可重复读:

  • 在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

  • 同一个事务范围内多次执行查询,同一个查询在time1时刻读取某一行,在time2时刻重新读取这一行数据时,发现这一行数据已经被修改,可能被更新了,也可能被删除了。

4、事务的隔离性

针对事务并发产生的问题,提出的解决方案就是事务的隔离性:

  • 事务的隔离性及时同一时间只允许一个事务请求同一数据,不同事物之间彼此没有任何干扰

  • 隔离级别读写数据时是有相应的锁机制实现的,所以就不会出现写一致性问题。修改数据时用到了排他锁保证事务串行化。

1)未提交读 read uncommitted:

  • 最低的隔离级别,

  • 一个事务在提交之前,对其他事务是可见的,即事务可以读取未提交的数据。

  • 存在“脏读”(读到了脏数据)问题;

2)提交读 read committed:

  • 事务在提交之前,对其它事务是不可见的。
  • 存在“不可重复读”(两次查询的得到的结果可能不同,即可能在查询的间隙,有事务提交了修改)问题。
  • 解决了“脏读”问题。

3)可重复读 repeatable read :

  • 在同一事务中多次读取的数据是一致的。

  • 解决了脏读和不可重复读问题,

  • 存在“幻读”(在事务两次查询间隙,有其他事务又插入或删除了新的记录)。

  • MySQL默认隔离级别。

4)可串行化 serializable :

  • 最高的隔离级别

  • 强制事务串行化执行。即一个事物一个事物挨个来执行。

  • 可以防止脏读、不可重复读以及幻读,但是这将严重影响程序的性能。

  • 通常情况下不会用到该级别。

MySQL默认采用的REPEATABLE_READ隔离级别。
Oracle 默认采用的 READ_COMMITTED 隔离级别。

5、InnoDB对死锁的处理

此处死锁与OS死锁类似,多个事务互相持有对方所有要申请资源的锁不释放,造成环路死锁。

MySQL InnoDB引擎检测到死锁循环依赖后,回滚持有最少行级锁的事务。

5、视图

  • 给某个查询语句设置别名,日后方便使用

  • 视图是一种虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能,不可以执行增删改操作(新版本可以??)

  • 游标是对查询出来的结果集作为一个单元来有效的处理。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

create view 视图名称 as 查询语句  --创建视图create view v1 as select * from student where sid > 10alter view 视图名称 as SQL查询语句  --修改视图drop view 视图名称  --删除视图

6、触发器

  • 当对某张表做增删改操作时,可以使用触发器自定义关联行为
delimiter //  --修改终止符,默认为;
create trigger t1 BEFORE INSERT on student for EACH ROW
BEGININSERT into teacher(tname) values('ssa');
-- 此时每次在student表中插入新数据时,都将在teacher表中插入ssaINSERT into teacher(tname) values(NEW.name)
-- 此时每次在student表中插入新数据时,都将在teacher表中插入该新数据的name项
END //
delimiter ;
  • NEW 代指的是新插入的数据,常用在insert与update中

  • OLD 代指的是老数据,常用在delete与update中

创建触发器:

create trigger t1  AFTER INSERT  on student for EACH ROW
create trigger t1  BEFORE DELETE on student for EACH ROW
create trigger t1  AFTER DELETE  on student for EACH ROW
create trigger t1  BEFORE UPDATE on student for EACH ROW
create trigger t1  AFTER UPDATE  on student for EACH ROWdrop trigger t1  --删除触发器:

7、函数

  • 对性能要求不高的时候可以用函数

内置函数:

select 函数名
select CURDATE()  # 取得当前时间:比如2017-06-09
--时间格式化
select DATE_FORMAT('2009-1-04 22:23:00', %W %M %Y)  --输出‘Sunday October 2009’

自定义函数(有返回值)

delimiter \\
create function f1(i1 inti2 int)return intBEGINdeclare num int default 0;set num = i1 + i2;return(num);
END \\
delimiter ;
  • 执行一次之后会被保存在数据库里,调用的时候直接select f1(1,100); 即可

8、存储过程

MySQL存储过程

  • 保存在MYSQL上的一个别名 => 一坨SQL语句,用来替代程序员写SQL语句

  • SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

  • 存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。

  • 当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。

  • 特性:可传参(in,out, inout ),无返回值,可以通过out参数伪造,一般out用于标识存储过程的执行结果

--1.无参数时:
create PROCEDURE p1()
--调用的时候:
call p1()--2.有参数时:(in,out ,inout)
DELIMITER //
create PROCEDURE p1(in i1 intin i2 int)
BEGINSELECT COUNT(*) INTO s FROM students;
END//
DELIMITER ;--调用的时候:
call p1(x1,x2)--3.传入变量  out
DELIMITER //
create PROCEDURE p3(in n1 intout n2 int)
BEGIN set n2 = 123123;select * from student where sid > n1
END//
DELIMITER ;--调用的时候:
set @v1 = 0
call p3(12, @v1)
select @v1;

MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,

所以要事先用 “ DELIMITER // ” 声明当前段分隔符,让编译器把两个" // "之间的内容当做存储过程的代码,不会执行这些代码;

“ DELIMITER ; ”的意思为把分隔符还原。

9、动态执行SQL

10、SQL优化

1、一条SQL语句在数据库框架中的执行流程

  1. 应用程序把查询SQL语句发送给服务器端执行;

  2. 查询缓存(大小写敏感的哈希查找,常数时间),如果查询缓存是打开的,服务器在接受到查询请求后,并不会直接去数据库查询,而是在数据库的查询缓存中找是否有相对应的查询数据,如果存在,则直接返回给客户端。否则下一步;

  3. 查询优化处理,生成执行计划。主要包括解析SQL、预处理、优化SQL执行计划;

  4. MySQL根据相应的执行计划,根据存储引擎的不同调用API完成整个查询,(一棵指令树);

  5. 将查询结果返回给客户端。

2、MySQL问题排查的手段

  • 使用show processlist 命令查看当前所有连接信息;

  • 使用Explain命令查询SQL语句执行计划;

  • 开启慢查询日志,查看慢查询的SQL。

执行计划:让MySQL预估执行操作(一般正确)

可以用来查语句的大概执行时间

  • all < index < range < index_merge < ref_or_null < ref < eq_ref <system / const
  • explain + sql语句

3、查询性能的优化方法

  • 减少请求的数据量

  • 只返回必要的列:最好不要使用SELECT * 语句;

  • 只返回必要的行:使用LIMIT语句来限制返回的数据;

  • 缓存重复查询的数据:
    使用缓存可以避免在数据库中进行查询,特别在要查询的数据经常被重复查询时,缓存带来的查询性能提升将会是非常明显的。

  • 切分查询(大查询切分成为小查询,避免一次性锁住大量数据)

  • 分解关联查询(单表查询,结果在应用程序中进行关联,可以减少处理过程中的锁争用)

  • 尽量先做单表查询;

  • 减少服务器端扫描的行数: 最有效的方式是使用索引来覆盖查询。

4、对数据库作优化

  1. 调整数据结构的设计,在经常性的检索列上,建立必要索引,以加快搜索速率,避免全表扫描(索引覆盖扫描);

  2. 调整SQL语句, ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句。

  3. 调整服务器内存分配。
    内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。

  4. 调整硬盘I/O,DBA可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。

5、MySQL数据库CPU飙升到500%怎么处理

列出所有进程 show processlist,观察所有进程,多秒没有状态变化的(干掉);

查看超时日志或者错误日志 (一般会是查询以及大批量的插入会导致 CPU与 I/O 上涨,当然不排除网络状态突然断了,导致一个请求服务器只接受到一半。)

11、数据库的数据存放方法

/2、数据库连接泄露的含义

数据库连接泄露指的是如果在某次使用或者某段程序中没有正确地关闭Connection、Statement和ResultSet资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏。

数据库连接的资源是宝贵而且是有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。

13、水平切分和垂直切分

水平切分是将同一个表中的记录拆分到多个结构相同的表中。当一个表的数据不断增多时,水平切分是必然的选择,它可以将数据分布到集群的不同节点上,从而缓存单个数据库的压力。

垂直切分是将一张表按列切分成多个表,通常是按照列的关系密集程度进行切分,也可以利用垂直切分将经常被使用的列和不经常被使用的列切分到不同的表中。

例如:将原来的电商数据库垂直切分成商品数据库、用户数据库等。

数据库整理一:Mysql基础知识相关推荐

  1. 数据库设计笔记——MySQL基础知识(四)

    概述 关系型数据库--由表来存储相关的数据,MySQL,SQL Server,Oracle等都是关系型数据库: 元数据:用于集成并管理数据. MySQL数据库 用户数据库:用户根据需求创建数据库 系统 ...

  2. MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物

    MySQL基础知识-MySQL概述安装,单表增删改查,函数,约束,多表查询,事物 前言 1.MySQL概述 1.1数据库相关概念 1.2MySQL数据库 1.2.1版本 1.2.2下载 1.2.3安装 ...

  3. 快速学习mysql_快速学习MySQL基础知识

    这篇文章主要梳理了 SQL 的基础用法,会涉及到以下方面内容: SQL大小写的规范 数据库的类型以及适用场景 SELECT 的执行过程 WHERE 使用规范 MySQL 中常见函数 子查询分类 如何选 ...

  4. MySQL工作中的实际用_总结工作中经常用到的mysql基础知识

    总结工作中经常用到的mysql基础知识 发布时间:2020-06-08 11:27:30 来源:51CTO 阅读:217 作者:三月 本文主要给大家介绍工作中经常用到的mysql基础知识,文章内容都是 ...

  5. mysql基础知识(一)

    mysql是主流的关系型数据库管理系统(RDBMS---relation database management system),操作是需要用SQL(Structured Query Language ...

  6. 初一计算机基础知识试题及答案,【2017年整理】计算机基础知识试题及答案.doc...

    [2017年整理]计算机基础知识试题及答案 (一)单选题(40)1.在资源管理器窗口中,被选中的文件或文件夹会____B___.A.加框显示 B.反像显示C.加亮显示 D.闪烁显示2.在Windows ...

  7. linux增删查改语句,mysql基础知识之增删查改使用介绍

    mysql基础知识之增删查改使用介绍 本文主要介绍mysql常用的SELECT.INSERT.UPDATE.DELETE语句的使用,数据库的安装这里不做介绍,并且事先已经准备好相关数据. 本文中使用的 ...

  8. MySql基础知识【一】

    Mysql基础知识 1. MySql是什么 2. 数据库设计的三大范式 2.1. 第一范式 2.2. 第二范式 2.3. 第三范式 3. Binlog的三种模式 3.1 Statement模式(默认) ...

  9. 2.MySQL 基础知识

    文章目录 MySQL 基础知识 知识点一 : MySQL命令行常用命令 知识点二 : 持久化 相关概念 知识点三 : 数据库 相关概念 知识点四 : DB 和 DBMS 关系图示 知识点五 : MyS ...

  10. mysql+连接每一行数据_MySQL_深入mysql基础知识的详解,1.每个客户端连接都会从服务 - phpStudy...

    深入mysql基础知识的详解 1.每个客户端连接都会从服务器进程中分到一个属于它的线程.而该连接的相应查询都都会通过该线程处理. 2.服务器会缓存线程.因此并不会为每个新连接创建或者销毁线程. 3.当 ...

最新文章

  1. php smarty关闭缓存,php+Smarty的缓存操作
  2. huffman树和huffman编码
  3. Android之解析Android Map地图返回的Json数据
  4. php值传参,引用传参以及对象传参
  5. 16、ASP.NET MVC入门到精通——MVC过滤器
  6. spring控制事务:声明式事务(XML)事务的传播行为
  7. 如果编程替换成中文就会怎样? 程序员看了表示头疼
  8. java字符串常量存哪里_浅谈JAVA中字符串常量的储存位置
  9. Win8 64位安装Oracle 11g时错
  10. Win10技巧:如何确定电脑是否适用Hyper-V虚拟机?
  11. DB2数据库常用命令
  12. Description: 80010105 / 服务器出现意外情况。【亲测可用】
  13. bignumber.js API
  14. 沉降观测原始数据编译
  15. python根据经纬度画热力图_【python】使用python按照一定格式批量输出,地图热力图经纬度格式生成器...
  16. Excel中的快捷实用操作
  17. 回顾之前给公司的建议,及离开前想说的话
  18. win10升级win11后电源设置里面找不到休眠功能
  19. 沈阳服务器主板维修,沈阳铁西区附近电脑主板维修
  20. nexus搭建npm私服

热门文章

  1. 使用chrom访问本地项目需要输入http
  2. 中国式父母计算机科学家攻略,中国式家长攻略大全:全结局解锁技巧汇总[多图]...
  3. docker文件过大,Docker容器引擎,迁移/var/lib/docker/到本机其它挂载分区或远程主机的某个分区。docker迁移
  4. python脚本文件的扩展命是什么_一些文件的扩展名
  5. 【嵌入式10】stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期
  6. 扬帆牧哲:跨境电商还有未来吗?
  7. 天空飘彩带的css3代码_纯CSS3实现飘逸洒脱带有飞行效果的三级下拉菜单
  8. 闰秒(leapsecond)和原子钟(Atomic Clock)究竟是什么
  9. PHP 类型提示 type hinting
  10. 企业年会直播该怎么玩