石家庄网站制作视频,wordpress商业模板破解,东莞网站推广裙,鲸影视官方网站下载1、内连接和外连接的区别
内连接和外连接都是数据库进行多表联查时使用的连接方式#xff0c;区别在于二者获取的数据集不同
内连接指的是使用左表中的每一条数据分别去连接右表中的每一条数据#xff0c;仅仅显示出匹配成功的那部分
外连接有分为左外连接和右外连接
左外…1、内连接和外连接的区别
内连接和外连接都是数据库进行多表联查时使用的连接方式区别在于二者获取的数据集不同
内连接指的是使用左表中的每一条数据分别去连接右表中的每一条数据仅仅显示出匹配成功的那部分
外连接有分为左外连接和右外连接
左外连接: 首先要显示出左表的全部然后使用连接条件匹配右表能匹配中的就显示匹配不中的显示为null右外连接: 首先要显示出右表的全部然后使用连接条件匹配左表能匹配中的就显示匹配不中的显示为null
2、drop、delete与truncate区别
这个关键字都是MySQL中用于删除的关键字区别在于
delete语句执行删除的过程是每次从表中删除一行并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作drop 主要用于删除数据表、表中的列、索引等结构truncate 是直接把表删除然后再重建表结构
这三种方式在效率方面drop 最高、truncate 其次、delete最低但是drop和truncate 都不记录日志无法回滚
3、union与union all的区别
union和union all都是MySQL中用于合并多条select语句结果的关键字它会将前后两条select语句的结果组合到一个结果集合中
区别在于UNION ALL会返回所有结果UNION会去掉重复的记录
4、char和varchar的区别
char和varchar是MySQL中的字符串类型区别在于下面几方面
最大长度char最大长度是255字符varchar最大长度是65535个字节占用长度char是定长的不足的部分用隐藏空格填充varchar是不定长的空间使用char会浪费空间varchar会更加节省空间查找效率char查找效率会很高varchar查找效率会更低
因此我们如果存储固定长度的列例如身份证号、手机号建议使用char
其它不定长度的建议使用varchar使用varchar的时候也要尽量让声明长度贴近实际长度 注意varchar(50)中50的涵义是最多存放50个字符varchar(50)和varchar(200)存储hello所占空间一样 5、事务的四大特性
事务的四大特性指的是原子性、一致性、隔离性、持久性
原子性事务是最小的执行单位不允许分割同一个事务中的所有命令要么全部执行要么全部不执行一致性事务执行前后数据的状态要保持一致例如转账业务中无论事务是否成功转账者和收款人的总额应该是不变的隔离性并发访问数据库时一个事务不被其他事务所干扰各并发事务是独立执行的持久性一个事务一旦提交对数据库的改变应该是永久的即使系统发生故障也不能丢失
6、并发事务带来的问题
并发事务下可能会产生如下的问题
脏读一个事务读取到了另外一个事务没有提交的数据不可重复读一个事务读取到了另外一个事务修改的数据幻读虚读一个事务读取到了另外一个事务新增的数据
7、事务隔离级别
事务隔离级别是用来解决并发事务问题的方案不同的隔离级别可以解决的事务问题不一样
读未提交 允许读取尚未提交的数据可能会导致脏读、幻读或不可重复读读已提交 允许读取并发事务已提交的数据可以阻止脏读但是幻读或不可重复读仍有可能发生可重复读 对同一字段的多次读取结果都是一致的除非数据是被本身事务自己所修改可以阻止脏读和不可重复读但幻读仍有可能发生可串行化 所有的事务依次逐个执行这样事务之间就完全不可能产生干扰该级别可以防止脏读、不可重复读以及幻读。
上面的这些事务隔离级别效率依次降低安全性依次升高如果不单独设置MySQL默认的隔离级别是可重复读
8、数据库三大范式
三大范式是指导设计数据库的原则
第一范式表中的每一列不能再进行拆分也就是每一列都应该是原子的第二范式一张表只做一件事不要将多个层次的数据列保存到一张表中第三范式数据不能存在传递关系也就是说可以通过其它字段推出来的字段没必要再存储
在现有的程序设计中认为第三范式是可以不遵守的也就是通过添加冗余字段来减少多表联查或计算我们称为反三范式
9、索引的分类
索引是数据库中用于提供查询效率的一种手段 从物理存储角度上分为聚集索引和非聚集索引 聚集索引指的是数据和索引存储在同一个文件中InnoDB存储引擎使用的是此类索引存储方式 非聚集索引指的是数据和索引存储在不同的文件中MyISAM存储引擎使用的是此类索引存储方式 从逻辑角度上分为普通、唯一、主键和联合索引它们都可以用来提高查询效率区别点在于 唯一索引可以限制某列数据不出现重复主键索引能够限制字段唯一、非空 联合索引指的是对多个字段建立一个索引一般是当经常使用某几个字段查询时才会使用它比对这几个列单独建立索引效率要高
10、索引的创建原则
索引可以大幅度提高查询的效率但不是所有的字段都要加也不是加的越多越好因为索引会占据磁盘空间也会影响增删改的效率
我们在建立索引的时候应该遵循下面这些原则
主键字段、外键字段应该添加索引经常作为查询条件、排序条件或分组条件的字段需要建立索引经常使用聚合函数进行统计的列可以建立索引经常使用多个条件查询时建议使用组合索引代替多个单列索引
除此之外下面这些情况不应该建立索引
数据量小的表不建议添加索引数据类型的字段是TEXT、BLOB、BIT等数据类型的字段不建议建索引不要在区分度低的字段建立索引比如性别字段、年龄字段等
11、索引失效的情况
索引失效指的是虽然在查询的列上添加了索引但是某些情况下查询的时候依旧没有用到索引常见的情况有
使用like关键字时模糊匹配使用开头将导致索引失效使用连接条件时如果条件中存在没有索引的列会导致索引失效在索引列上进行计算、函数运算、类型转换将导致索引失效使用 !、not in、is null、is not null时会导致索引失效使用联合索引时没有遵循最左匹配原则会导致索引失效
12、如何知道索引是否失效
MySQL中自带了一个关键字叫explain它可以加在一个sql的前面来查看这条sql的执行计划
在执行计划中我们主要观察两列的结果一列是type一列是extra
第一个type是重要的列显示本次查询使用了何种类型常见的值从坏到好依次为all、index、range、ref、eq_ref 、const、system
all表示全表扫描数据文件返回符合要求的记录index表示全表扫描索引文件返回符合要求的记录range表示检索指定范围的行常见于使用betweeninlike等运算符的查询中ref表示两表查询时驱动表可能返回多行数据也就是查询条件在主表中是加了一个普通索引eq_ref表示两表查询时驱动表只返回一行数据也就是查询条件在主表中是唯一的const表示索引一次就能得到结果一般是使用唯一索引或者主键作为查询条件system表示表中仅有一行数据很少见到
我们在优化的时候尽量优化到range级别以上
除了type之外我们需要关注一下extra列它表示执行状态说明 要保证此列不要出现using filesort、using temporary等使用临时表或外部文件的情况 如果出现using index最好了它表示列数据仅仅使用了索引中的信息而没有回表查询
13、MyISAM和InnoDB的区别
MyISAM和InnoDB是目前MySQL中最为流行的两种存储引擎它们的区别有这几方面
MyISAM不支持事务每次操作都是原子的InnoDB支持事务支持事务的四种隔离级别MyISAM不支持外键InnoDB支持外键MyISAM仅仅支持表级锁即每次操作是对整个表加锁InnoDB支持行级锁因此可以支持写并发MyISAM属于非聚集性索引它的数据和索引不在同一个文件中InnoDB属于聚集性索引它的数据和索引在同一个文件中MyISAM中主键和非主键索引的数据部分都是存储的文件的指针InnoDB主键索引的数据部分存储的是表记录非主键索引的数据部分存储的是主键值
14、查询语句执行流程 一条查询语句到达MySQL数据库之后数据库中的各个组件会按照顺序执行自己的任务
首先是连接器他会负责建立连接、检查权限等操作连接成功之后会查询缓存如果缓存中有结果会直接返回如果缓存中没有结果会将sql交给分析器处理分析器负责检查sql的词法、语法如果没有问题再将sql交给优化器处理优化器会决定用哪个索引决定表的连接顺序等然后将优化之后的sql交给执行器执行器根据存储引擎类型调用存储引擎接口存储引擎负责最后数据的读写
15、索引的数据结构是什么
在MySQL中索引使用的数据结构是BTreeB树是基于B树的变种它具有B树的平衡性而且树的高度更低
B树非叶子节点不存在数据只存索引因此其内部节点相对B树更小树的高度更小查询产生的I/O更少B树查询效率更高B树使用双向链表串连所有叶子节点区间查询效率更高B树查询效率更稳定B树每次都必须查询到叶子节点才能找到数据而B树查询的数据可能不在叶子节点也可能在这样就会造成查询的效率的不稳定
16、数据库中的锁有哪些
MySQL中的锁从不同维度可以分为不同的种类 从锁的粒度上可以分为表锁和行锁 表锁指的是会锁定修改数据所在的整个表开销小加锁快锁定粒度大发生锁冲突概率高 行锁指的是会锁定修改数据所在的行记录开销大加锁慢锁定粒度小发生锁冲突概率低 从锁的排他性上分为共享锁和排他锁 共享锁指的是当一个事务针对同一份数据加上共享锁之后另一个事务也可以再往上加一把共享锁也可以读数据但是不能改 对索引列加共享锁锁定的是一行数据对非索引列加共享锁锁定的是整表数据 排他锁指的的是当一个事务针对同一份数据加上排他锁之后另一个事务只能读数据不能改也不能再上其它任务锁 还有两种概念上的锁是悲观锁和乐观锁 悲观锁是指一个事务在修改数据的时候总是认为别人也会修改此数据所以强制要使用锁来保证数据安全 乐观锁是指一个事务在修改数据的时候总是认为别人不会修改此数据因为不加任何锁 这种情况下万一在当前事务修改的时候数据被其它事务也修改了机会出现问题此时常用的方案是 给数据表中添加一个version列每次更新后都将这个列的值加1读取数据时将版本号读取出来 在执行更新的时候会先比较版本号如果相同则执行更新如果不相同说明此条数据已经发生了变化就放弃更新或重试
17、MySQL日志类型
MySQL的很多功能都是依靠日志来实现的比如事务回滚数据备份主从复制等等常见的日志有下面几个 binlog归档日志 负责记录对数据库的写操作一般用在主从复制过程中记录日志从库拷贝此日志做重放实现数据同步 redolog重做日志 用于确保事务的持久性。防止在发生故障的时间点尚有脏页未写入磁盘 在重启 mysql 服务的时候根据 redo log 进行重做从而达到事务的持久性这一特性 undo log 回滚日志 保存了事务发生之前的数据的一个版本可以用于回滚
18、MySQL主从复制的流程
主从复制用于MySQL主从集群的主节点向从节点同步数据主要是依靠MySQL的binLog实现的大体流程分为三步
Master 主库在事务提交时会把数据变更记录在二进制日志文件 BinLog中从库读取主库的二进制日志文件 Binlog 写入到从库的中继日志 RelayLogslave重做中继日志中的事件将改变反映它自己的数据 19、谈谈你对sql的优化的经验
我在企业中优化Sql大体分为三步
查找问题sql主要手段是开启mysql的慢查询日志它会将执行时间较长的sql记录记录下来找到sql之后我会分析出现问题的原因原因很多主要字段类型选择错误、sql语句效率低、索引失效等等根据问题不同我会再去定具体的解决方案
简单给您说几个常见的把 确定选择的引擎是否合适 myisam适合于查询为主增删较少无事务要求的数据表 Innodb适用于有事务处理或者包括很多的更新和删除的数据表 表设计是否合理 单表不要有太多字段建议在20以内 合理的加入冗余字段可以提高查询速度 确定字段的数据类型是否合适 数值型字段的比较比字符串的比较效率高得多字段类型尽量使用最小、最简单的数据类型 设置合适的字符串类型char和varcharchar定长效率高varchar可变长度效率稍低varchar的长度只分配真正需要的空间 尽量使用TIMESTAMP而非DATETIME尽量设计所有字段都得有默认值尽量避免null 确定sql的书写是否有的题 SELECT语句务必指明字段名称避免直接使用select * SQL语句中IN包含的值不应过多 可以用内连接就尽量不要使用外连接 使用连接连接查询来代替子查询 适用联合(UNION)来代替手动创建的临时表 表数据比较多的时候是否添加了合适的索引 表的主键、外键必须有索引 经常出现在where子句中的字段特别是大表的字段应该建立索引 经常用于排序、分组的字段应当建立索引 加上索引之后还应该使用Explain来确认索引是否生效 如果上面的几项都没有问题那可能就是因为服务器性能或者数据量过大导致的查询慢此时可以考虑读写分离 也就是我们搭建一个MySQL的主从集群让1个主节点负责写入数据多个从节点负责查询数据已分摊查询压力