当前位置: 首页 > news >正文

小型公司网站建设郑州最好的设计公司

小型公司网站建设,郑州最好的设计公司,网站如何在推广,如何发布网站MySQL基础 什么是关系型数据库#xff1f; 顾名思义#xff0c;关系型数据库#xff08;RDB#xff0c;Relational Database#xff09;就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系#xff08;一对一、一对多、多对多…MySQL基础 什么是关系型数据库 顾名思义关系型数据库RDBRelational Database就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系一对一、一对多、多对多。 关系型数据库中我们的数据都被存放在了各种表中比如用户表表中的每一行就存放着一条数据比如一个用户的信息。 大部分关系型数据库都使用 SQL 来操作数据库中的数据。并且大部分关系型数据库都支持事务的四大特性(ACID)。 有哪些常见的关系型数据库呢 MySQL、PostgreSQL、Oracle、SQL Server、SQLite微信本地的聊天记录的存储就是用的 SQLite ……。 什么是SQL SQL 是一种结构化查询语言(Structured Query Language)专门用来与数据库打交道目的是提供一种从数据库中读写数据的简单有效的方法。 几乎所有的主流关系数据库都支持 SQL 适用性非常强。并且一些非关系型数据库也兼容 SQL 或者使用的是类似于 SQL 的查询语言。 SQL 可以帮助我们 新建数据库、数据表、字段在数据库中增加删除修改查询数据新建视图、函数、存储过程对数据库中的数据进行简单的数据分析搭配 HiveSpark SQL 做大数据搭配 SQLFlow 做机器学习 什么是MySQL MySQL 是一种关系型数据库主要用于持久化存储我们的系统中的一些数据比如用户信息。 由于 MySQL 是开源免费并且比较成熟的数据库因此MySQL 被大量使用在各种系统中。任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL 的默认端口号是3306。 MySQL有什么优点 MySQL 主要具有下面这些优点 成熟稳定功能完善。开源免费。文档丰富既有详细的官方文档又有非常多优质文章可供参考学习。开箱即用操作简单维护成本低。兼容性好支持常见的操作系统支持多种开发语言。社区活跃生态完善。事务支持优秀 InnoDB 存储引擎默认使用 REPEATABLE-READ 并不会有任何性能损失并且InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的。支持分库分表、读写分离、高可用。 MySQL字段类型 MySQL字段类型可以简单分为三大类 数值类型整型TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT、浮点型FLOAT 和 DOUBLE、定点型DECIMAL字符串类型CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB 等最常用的是 CHAR 和 VARCHAR。日期时间类型YEAR、TIME、DATE、DATETIME 和 TIMESTAMP 等。 整数类型的unsigned属性有什么用? MySQL 中的整数类型可以使用可选的 UNSIGNED 属性来表示不允许负值的无符号整数。使用 UNSIGNED 属性可以将正整数的上限提高一倍因为它不需要存储负数值。 例如 TINYINT UNSIGNED 类型的取值范围是 0 ~ 255而普通的 TINYINT 类型的值范围是 -128 ~ 127。INT UNSIGNED 类型的取值范围是 0 ~ 4,294,967,295而普通的 INT 类型的值范围是 -2,147,483,648 ~ 2,147,483,647。 对于从 0 开始递增的 ID 列使用 UNSIGNED 属性可以非常适合因为不允许负值并且可以拥有更大的上限范围提供了更多的 ID 值可用。 CHAR和VARCHAR的区别是什么 CHAR 和 VARCHAR 是最常用到的字符串类型两者的主要区别在于CHAR 是定长字符串VARCHAR 是变长字符串。 CHAR 在存储时会在右边填充空格以达到指定的长度检索时会去掉空格VARCHAR 在存储时需要使用 1 或 2 个额外字节记录字符串的长度检索时不需要处理。 CHAR 更适合存储长度较短或者长度都差不多的字符串例如 Bcrypt 算法、MD5 算法加密后的密码、身份证号码。VARCHAR 类型适合存储长度不确定或者差异较大的字符串例如用户昵称、文章标题等。 CHAR(M) 和 VARCHAR(M) 的 M 都代表能够保存的字符数的最大值无论是字母、数字还是中文每个都只占用一个字符。 VARCHAR100和VARCHAR10的区别是什么 VARCHAR(100)和 VARCHAR(10)都是变长类型表示能存储最多 100 个字符和 10 个字符。因此VARCHAR (100) 可以满足更大范围的字符存储需求有更好的业务拓展性。而 VARCHAR(10)存储超过 10 个字符时就需要修改表结构才可以。 虽说 VARCHAR(100)和 VARCHAR(10)能存储的字符范围不同但二者存储相同的字符串所占用磁盘的存储空间其实是一样的这也是很多人容易误解的一点。 不过VARCHAR(100) 会消耗更多的内存。这是因为 VARCHAR 类型在内存中操作时通常会分配固定大小的内存块来保存值即使用字符类型中定义的长度。例如在进行排序的时候VARCHAR(100)是按照 100 这个长度来进行的也就会消耗更多内存。 DECIMAL和FLOAT/DOUBLE的区别是什么 DECIMAL 和 FLOAT 的区别是DECIMAL 是定点数FLOAT/DOUBLE 是浮点数。DECIMAL 可以存储精确的小数值FLOAT/DOUBLE 只能存储近似的小数值。 DECIMAL 用于存储具有精度要求的小数例如与货币相关的数据可以避免浮点数带来的精度损失。 在 Java 中MySQL 的 DECIMAL 类型对应的是 Java 类 java.math.BigDecimal。 为什么不推荐使用TEXT和BLOG? 在日常开发中很少使用 TEXT 类型但偶尔会用到而 BLOB 类型则基本不常用。如果预期长度范围可以通过 VARCHAR 来满足建议避免使用 TEXT。 数据库规范通常不推荐使用 BLOB 和 TEXT 类型这两种类型具有一些缺点和限制例如 不能有默认值。在使用临时表时无法使用内存临时表只能在磁盘上创建临时表《高性能 MySQL》书中有提到。检索效率较低。不能直接创建索引需要指定前缀长度。可能会消耗大量的网络和 IO 带宽。可能导致表上的 DML 操作变慢。 DATETIME和TIMESTAMP的区别是什么 DATETIME 类型没有时区信息TIMESTAMP 和时区有关。 TIMESTAMP 只需要使用 4 个字节的存储空间但是 DATETIME 需要耗费 8 个字节的存储空间。但是这样同样造成了一个问题Timestamp 表示的时间范围更小。 DATETIME1000-01-01 00:00:00 ~ 9999-12-31 23:59:59Timestamp1970-01-01 00:00:01 ~ 2037-12-31 23:59:59 NULL和‘ ’的区别是什么 NULL 跟 (空字符串)是两个完全不一样的值区别如下 NULL 代表一个不确定的值,就算是两个 NULL,它俩也不一定相等。例如SELECT NULLNULL的结果为 false但是在我们使用DISTINCT,GROUP BY,ORDER BY时,NULL又被认为是相等的。的长度是 0是不占用空间的而NULL 是需要占用空间的。NULL 会影响聚合函数的结果。例如SUM、AVG、MIN、MAX 等聚合函数会忽略 NULL 值。 COUNT 的处理方式取决于参数的类型。如果参数是 *(COUNT(*))则会统计所有的记录数包括 NULL 值如果参数是某个字段名(COUNT(列名))则会忽略 NULL 值只统计非空值的个数。查询 NULL 值时必须使用 IS NULL 或 IS NOT NULLl 来判断而不能使用 、!、 、 之类的比较运算符。而是可以使用这些比较运算符的。 Boolean类型如何表示 MySQL 中没有专门的布尔类型而是用 TINYINT(1) 类型来表示布尔值。TINYINT(1) 类型可以存储 0 或 1分别对应 false 或 true。 MySQL基础架构 MySQL 主要由下面几部分构成 连接器 身份认证和权限相关(登录 MySQL 的时候)。查询缓存 执行查询语句的时候会先查询缓存MySQL 8.0 版本后移除因为这个功能不太实用。分析器 没有命中缓存的话SQL 语句就会经过分析器分析器说白了就是要先看你的 SQL 语句要干嘛再检查你的 SQL 语句语法是否正确。优化器 按照 MySQL 认为最优的方案去执行。执行器 执行语句然后从存储引擎返回数据。 执行语句之前会先判断是否有权限如果没有权限的话就会报错。插件式存储引擎主要负责数据的存储和读取采用的是插件式架构支持 InnoDB、MyISAM、Memory 等多种存储引擎。 MySQL存储引擎 MySQL支持哪些存储引擎默认使用哪个 MySQL 支持多种存储引擎你可以通过 SHOW ENGINES 命令来查看 MySQL 支持的所有存储引擎。 查看 MySQL 提供的所有存储引擎 从上图我们可以查看出 MySQL 当前默认的存储引擎是 InnoDB。并且所有的存储引擎中只有 InnoDB 是事务性存储引擎也就是说只有 InnoDB 支持事务 MySQL 5.5.5 之前MyISAM 是 MySQL 的默认存储引擎。5.5.5 版本之后InnoDB 是 MySQL 的默认存储引擎。 MySQL存储引擎架构了解吗 MySQL 存储引擎采用的是 插件式架构 支持多种存储引擎我们甚至可以为不同的数据库表设置不同的存储引擎以适应不同场景的需要。存储引擎是基于表的而不是数据库。 MyISAM和InnoDB有什么区别 总结 InnoDB 支持行级别的锁粒度MyISAM 不支持只支持表级别的锁粒度。MyISAM 不提供事务支持。InnoDB 提供事务支持实现了 SQL 标准定义了四个隔离级别。MyISAM 不支持外键而 InnoDB 支持。MyISAM 不支持 MVCC而 InnoDB 支持。虽然 MyISAM 引擎和 InnoDB 引擎都是使用 BTree 作为索引结构但是两者的实现方式不太一样。MyISAM 不支持数据库异常崩溃后的安全恢复而 InnoDB 支持。InnoDB 的性能比 MyISAM 更强大。 常见MySQL存储引擎对比 MyISAM和InnoDB如何选择 大多数时候我们使用的都是 InnoDB 存储引擎在某些读密集的情况下使用 MyISAM 也是合适的。不过前提是你的项目不介意 MyISAM 不支持事务、崩溃恢复等缺点可是~我们一般都会介意啊。 因此对于咱们日常开发的业务系统来说你几乎找不到什么理由使用 MyISAM 了老老实实用默认的 InnoDB 就可以了 MySQL索引 内容比较多另起了一篇文章 MySQL查询缓存 MySQL 查询缓存是查询结果缓存。执行查询语句的时候会先查询缓存如果缓存中有对应的查询结果就会直接返回。 查询缓存会在同样的查询条件和数据情况下直接返回缓存中的结果。但需要注意的是查询缓存的匹配条件非常严格任何细微的差异都会导致缓存无法命中。这里的查询条件包括查询语句本身、当前使用的数据库、以及其他可能影响结果的因素如客户端协议版本号等。 查询缓存不命中的情况 任何两个查询在任何字符上的不同都会导致缓存不命中。如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表其查询结果也不会被缓存。缓存建立之后MySQL 的查询缓存系统会跟踪查询中涉及的每张表如果这些表数据或结构发生变化那么和这张表相关的所有缓存数据都将失效。 缓存虽然能够提升数据库的查询性能但是缓存同时也带来了额外的开销每次查询后都要做一次缓存操作失效后还要销毁。 因此开启查询缓存要谨慎尤其对于写密集的应用来说更是如此。如果开启要注意合理控制缓存空间大小一般来说其大小设置为几十 MB 比较合适。 MySQL 5.6 开始查询缓存已默认禁用。MySQL 8.0 开始已经不再支持查询缓存了 MySQl日志 内容比较多另起了一篇文章 MySQL事务 何谓事务 何为事务 一言蔽之事务是逻辑上的一组操作要么都执行要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账 1000 元这个转账会涉及到两个关键操作这两个操作必须都成功或者都失败。 将小明的余额减少 1000 元将小红的余额增加 1000 元。 事务会把这两个操作就可以看成逻辑上的一个整体这个整体包含的操作要么都成功要么都要失败。这样就不会出现小明余额减少而小红的余额却并没有增加的情况。 何谓数据库事务 大多数情况下我们在谈论事务的时候如果没有特指分布式事务往往指的就是数据库事务。 数据库事务在我们日常开发中接触的最多了。如果你的项目属于单体架构的话你接触到的往往就是数据库事务了。 那数据库事务有什么作用呢 简单来说数据库事务可以保证多个对数据库的操作也就是 SQL 语句构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循要么全部执行成功,要么全部不执行 。 另外关系型数据库例如MySQL、SQL Server、Oracle 等事务都有 ACID 特性 原子性Atomicity事务是最小的执行单位不允许分割。事务的原子性确保动作要么全部完成要么完全不起作用一致性Consistency执行事务前后数据保持一致例如转账业务中无论事务是否成功转账者和收款人的总额应该是不变的隔离性Isolation并发访问数据库时一个用户的事务不被其他事务所干扰各并发事务之间数据库是独立的持久性Durability一个事务被提交之后。它对数据库中数据的改变是持久的即使数据库发生故障也不应该对其有任何影响。 并发事务带来了哪些问题 脏读Dirty read 一个事务读取数据并且对数据进行了修改这个修改对其他事务来说是可见的即使当前事务没有提交。这时另外一个事务读取了这个还未提交的数据但第一个事务突然回滚导致数据并没有被提交到数据库那第二个事务读取到的就是脏数据这也就是脏读的由来。 例如事务 1 读取某表中的数据 A20事务 1 修改 AA-1事务 2 读取到 A 19,事务 1 回滚导致对 A 的修改并未提交到数据库 A 的值还是 20。 丢失修改Lost to modify 在一个事务读取一个数据时另外一个事务也访问了该数据那么在第一个事务中修改了这个数据后第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失因此称为丢失修改。 例如事务 1 读取某表中的数据 A20事务 2 也读取 A20事务 1 先修改 AA-1事务 2 后来也修改 AA-1最终结果 A19事务 1 的修改被丢失。 不可重复读Unrepeatable read 指在一个事务内多次读同一数据。在这个事务还没有结束时另一个事务也访问该数据。那么在第一个事务中的两次读数据之间由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况因此称为不可重复读。 例如事务 1 读取某表中的数据 A20事务 2 也读取 A20事务 1 修改 AA-1事务 2 再次读取 A 19此时读取的结果和第一次读取的结果不同。 幻读Phantom read 幻读与不可重复读类似。它发生在一个事务读取了几行数据接着另一个并发事务插入了一些数据时。在随后的查询中第一个事务就会发现多了一些原本不存在的记录就好像发生了幻觉一样所以称为幻读。 例如事务 2 读取某个范围的数据事务 1 在这个范围插入了新的数据事务 2 再次读取这个范围的数据发现相比于第一次读取的结果多了新的数据。 不可重复读和幻读有什么区别 不可重复读的重点是内容修改或者记录减少比如多次读取一条记录发现其中某些记录的值被修改幻读的重点在于记录新增比如多次执行同一条查询语句DQL时发现查到的记录增加了。 幻读其实可以看作是不可重复读的一种特殊情况单独把幻读区分出来的原因主要是解决幻读和不可重复读的方案不一样。 举个例子执行 delete 和 update 操作的时候可以直接对记录加锁保证事务安全。而执行 insert 操作的时候由于记录锁Record Lock只能锁住已经存在的记录为了避免插入新记录需要依赖间隙锁Gap Lock。也就是说执行 insert 操作的时候需要依赖 Next-Key LockRecord LockGap Lock 进行加锁来保证不出现幻读。 并发事务的控制方式有哪些 MySQL 中并发事务的控制方式无非就两种锁 和 MVCC。锁可以看作是悲观控制的模式多版本并发控制MVCCMultiversion concurrency control可以看作是乐观控制的模式。 锁 控制方式下会通过锁来显式控制共享资源而不是通过调度手段MySQL 中主要是通过 读写锁 来实现并发控制。 共享锁S 锁又称读锁事务在读取记录的时候获取共享锁允许多个事务同时获取锁兼容。排他锁X 锁又称写锁/独占锁事务在修改记录的时候获取排他锁不允许多个事务同时获取。如果一个记录已经被加了排他锁那其他事务不能再对这条记录加任何类型的锁锁不兼容。 读写锁可以做到读读并行但是无法做到写读、写写并行。另外根据根据锁粒度的不同又被分为 表级锁(table-level locking) 和 行级锁(row-level locking) 。InnoDB 不光支持表级锁还支持行级锁默认为行级锁。行级锁的粒度更小仅对相关的记录上锁即可对一行或者多行记录加锁所以对于并发写入操作来说 InnoDB 的性能更高。不论是表级锁还是行级锁都存在共享锁Share LockS 锁和排他锁Exclusive LockX 锁这两类。 MVCC 是多版本并发控制方法即对一份数据会存储多个版本通过事务的可见性来保证事务能看到自己应该看到的版本。通常会有一个全局的版本分配器来为每一行数据设置版本号版本号是唯一的。 MVCC 在 MySQL 中实现所依赖的手段主要是: 隐藏字段、read view、undo log。 undo log : undo log 用于记录某行数据的多个版本的数据。read view 和 隐藏字段 : 用来判断当前版本数据的可见性。 SQL标准定义了哪些事务隔离级别 SQL 标准定义了四个隔离级别 READ-UNCOMMITTED(读取未提交) 最低的隔离级别允许读取尚未提交的数据变更可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交) 允许读取并发事务已经提交的数据可以阻止脏读但是幻读或不可重复读仍有可能发生。REPEATABLE-READ(可重复读) 对同一字段的多次读取结果都是一致的除非数据是被本身事务自己所修改可以阻止脏读和不可重复读但幻读仍有可能发生。SERIALIZABLE(可串行化) 最高的隔离级别完全服从 ACID 的隔离级别。所有的事务依次逐个执行这样事务之间就完全不可能产生干扰也就是说该级别可以防止脏读、不可重复读以及幻读。 隔离级别脏读不可重复读幻读READ-UNCOMMITTED√√√READ-COMMITTED×√√REPEATABLE-READ××√SERIALIZABLE××× MySQL的隔离级别是基于锁实现的吗 MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。 SERIALIZABLE 隔离级别是通过锁来实现的READ-COMMITTED 和 REPEATABLE-READ 隔离级别是基于 MVCC 实现的。不过 SERIALIZABLE 之外的其他隔离级别可能也需要用到锁机制就比如 REPEATABLE-READ 在当前读情况下需要使用加锁读来保证不会出现幻读。 MySQL的默认隔离级别是什么 MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ可重读。我们可以通过SELECT tx_isolation;命令来查看MySQL 8.0 该命令改为SELECT transaction_isolation; MySQL锁 锁是一种常见的并发事务的控制方式。 表级锁和行级锁了解吗有什么区别 MyISAM 仅仅支持表级锁(table-level locking)一锁就锁整张表这在并发写的情况下性非常差。InnoDB 不光支持表级锁(table-level locking)还支持行级锁(row-level locking)默认为行级锁。 行级锁的粒度更小仅对相关的记录上锁即可对一行或者多行记录加锁所以对于并发写入操作来说 InnoDB 的性能更高。 表级锁和行级锁对比 表级锁 MySQL 中锁定粒度最大的一种锁全局锁除外是针对非索引字段加的锁对当前操作的整张表加锁实现简单资源消耗也比较少加锁快不会出现死锁。不过触发锁冲突的概率最高高并发下效率极低。表级锁和存储引擎无关MyISAM 和 InnoDB 引擎都支持表级锁。行级锁 MySQL 中锁定粒度最小的一种锁是 针对索引字段加的锁 只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小并发度高但加锁的开销也最大加锁慢会出现死锁。行级锁和存储引擎有关是在存储引擎层面实现的。 行级锁的使用有什么注意事项? InnoDB 的行锁是针对索引字段加的锁表级锁是针对非索引字段加的锁。当我们执行 UPDATE、DELETE 语句时如果 WHERE条件中字段没有命中唯一索引或者索引失效的话就会导致扫描全表对表中的所有行记录进行加锁。这个在我们日常工作开发中经常会遇到一定要多多注意 不过很多时候即使用了索引也有可能会走全表扫描这是因为 MySQL 优化器的原因。 InnoDB有哪几类行锁 InnoDB 行锁是通过对索引数据页上的记录加锁实现的MySQL InnoDB 支持三种行锁定方式 记录锁Record Lock也被称为记录锁属于单个行记录上的锁。间隙锁Gap Lock锁定一个范围不包括记录本身。临键锁Next-Key LockRecord LockGap Lock锁定一个范围包含记录本身主要目的是为了解决幻读问题MySQL 事务部分提到过。记录锁只能锁住已经存在的记录为了避免插入新记录需要依赖间隙锁。 在 InnoDB 默认的隔离级别 REPEATABLE-READ 下行锁默认使用的是 Next-Key Lock。但是如果操作的索引是唯一索引或主键InnoDB 会对 Next-Key Lock 进行优化将其降级为 Record Lock即仅锁住索引本身而不是范围。 共享锁和排他锁呢 不论是表级锁还是行级锁都存在共享锁Share LockS 锁和排他锁Exclusive LockX 锁这两类 共享锁S 锁又称读锁事务在读取记录的时候获取共享锁允许多个事务同时获取锁兼容。排他锁X 锁又称写锁/独占锁事务在修改记录的时候获取排他锁不允许多个事务同时获取。如果一个记录已经被加了排他锁那其他事务不能再对这条事务加任何类型的锁锁不兼容。 排他锁与任何的锁都不兼容共享锁仅和共享锁兼容。 S 锁X 锁S 锁不冲突冲突X 锁冲突冲突 意向锁有什么作用 如果需要用到表锁的话如何判断表中的记录没有行锁呢一行一行遍历肯定是不行性能太差。我们需要用到一个叫做意向锁的东东来快速判断是否可以对某个表使用表锁。 意向锁是表级锁共有两种 意向共享锁Intention Shared LockIS 锁事务有意向对表中的某些记录加共享锁S 锁加共享锁前必须先取得该表的 IS 锁。意向排他锁Intention Exclusive LockIX 锁事务有意向对表中的某些记录加排他锁X 锁加排他锁之前必须先取得该表的 IX 锁。 意向锁是由数据引擎自己维护的用户无法手动操作意向锁在为数据行加共享/排他锁之前InnoDB 会先获取该数据行所在在数据表的对应意向锁。 意向锁之间是互相兼容的。 IS 锁IX 锁IS 锁兼容兼容IX 锁兼容兼容 意向锁和共享锁和排它锁互斥这里指的是表级别的共享锁和排他锁意向锁不会与行级的共享锁和排他锁互斥。 IS 锁IX 锁S 锁兼容互斥X 锁互斥互斥 当前读和快照读有什么区别 快照读一致性非锁定读就是单纯的 SELECT 语句但不包括下面这两类 SELECT 语句 SELECT ... FOR UPDATE # 共享锁 可以在 MySQL 5.7 和 MySQL 8.0 中使用 SELECT ... LOCK IN SHARE MODE; # 共享锁 可以在 MySQL 8.0 中使用 SELECT ... FOR SHARE;快照即记录的历史版本每行记录可能存在多个历史版本多版本技术。 快照读的情况下如果读取的记录正在执行 UPDATE/DELETE 操作读取操作不会因此去等待记录上 X 锁的释放而是会去读取行的一个快照。 只有在事务隔离级别 RC(读取已提交) 和 RR可重读下InnoDB 才会使用一致性非锁定读 在 RC 级别下对于快照数据一致性非锁定读总是读取被锁定行的最新一份快照数据。在 RR 级别下对于快照数据一致性非锁定读总是读取本事务开始时的行数据版本。 快照读比较适合对于数据一致性要求不是特别高且追求极致性能的业务场景。 当前读 一致性锁定读就是给行记录加 X 锁或 S 锁。 当前读的一些常见 SQL 语句类型如下 # 对读的记录加一个X锁 SELECT...FOR UPDATE # 对读的记录加一个S锁 SELECT...LOCK IN SHARE MODE # 对读的记录加一个S锁 SELECT...FOR SHARE # 对修改的记录加一个X锁 INSERT... UPDATE... DELETE...自增锁有了解吗 不太重要的一个知识点简单了解即可。 关系型数据库设计表的时候通常会有一列作为自增主键。InnoDB 中的自增主键会涉及一种比较特殊的表级锁— 自增锁AUTO-INC Locks 。 更准确点来说不仅仅是自增主键AUTO_INCREMENT的列都会涉及到自增锁毕竟非主键也可以设置自增长。 如果一个事务正在插入数据到有自增列的表时会先获取自增锁拿不到就可能会被阻塞住。这里的阻塞行为只是自增锁行为的其中一种可以理解为自增锁就是一个接口其具体的实现有多种。 MySQL性能优化 内容比较多另起了一篇文章 能用MySQL直接存储文件比如图片吗 可以是可以直接存储文件对应的二进制数据即可。不过还是建议不要在数据库中存储文件会严重影响数据库性能消耗过多存储空间。 可以选择使用云服务厂商提供的开箱即用的文件存储服务成熟稳定价格也比较低 也可以选择自建文件存储服务实现起来也不难基于 FastDFS、MinIO推荐 等开源项目就可以实现分布式文件服务。 数据库只存储文件地址信息文件由文件存储服务负责存储。 MySQL如何存储IP地址 可以将 IP 地址转换成整形数据存储性能更好占用空间也更小。 MySQL 提供了两个方法来处理 ip 地址 INET_ATON()把 ip 转为无符号整型 (4-8 位)INET_NTOA() :把整型的 ip 转为地址 插入数据前先用 INET_ATON() 把 ip 地址转为整型显示数据时使用 INET_NTOA() 把整型的 ip 地址转为地址显示即可。 有哪些常见的SQL优化手段 内容有点多会另起一篇文章 如何分析SQL的性能 我们可以使用 EXPLAIN 命令来分析 SQL 的 执行计划 。执行计划是指一条 SQL 语句在经过 MySQL 查询优化器的优化会后具体的执行方式。 EXPLAIN 并不会真的去执行相关的语句而是通过 查询优化器 对语句进行分析找出最优的查询方案并显示对应的信息。 EXPLAIN 适用于 SELECT, DELETE, INSERT, REPLACE, 和 UPDATE语句我们一般分析 SELECT 查询较多。 我们这里简单来演示一下 EXPLAIN 的使用。 各个字段的含义如下 列名含义idSELECT 查询的序列标识符select_typeSELECT 关键字对应的查询类型table用到的表名partitions匹配的分区对于未分区的表值为 NULLtype表的访问方法possible_keys可能用到的索引key实际用到的索引key_len所选索引的长度ref当使用索引等值查询时与索引作比较的列或常量rows预计要读取的行数filtered按表条件过滤后留存的记录数的百分比Extra附加信息 读写分离和分库分表了解吗 内容有点多会另起一篇文章 深度分页如何优化 内容有点多会另起一篇文章 数据冷热分离如何做 内容有点多会另起一篇文章 MySQL性能怎么优化 MySQL 性能优化是一个系统性工程涉及多个方面在面试中不可能面面俱到。因此建议按照“点-线-面”的思路展开从核心问题入手再逐步扩展展示出你对问题的思考深度和解决能力。 1. 抓住核心慢 SQL 定位与分析 性能优化的第一步永远是找到瓶颈。面试时建议先从 慢 SQL 定位和分析 入手这不仅能展示你解决问题的思路还能体现你对数据库性能监控的熟练掌握 监控工具 介绍常用的慢 SQL 监控工具如 MySQL 慢查询日志、Performance Schema 等说明你对这些工具的熟悉程度以及如何通过它们定位问题。EXPLAIN 命令 详细说明 EXPLAIN 命令的使用分析查询计划、索引使用情况可以结合实际案例展示如何解读分析结果比如执行顺序、索引使用情况、全表扫描等。 2. 由点及面索引、表结构和 SQL 优化 定位到慢 SQL 后接下来就要针对具体问题进行优化。 这里可以重点介绍索引、表结构和 SQL 编写规范等方面的优化技巧 索引优化 这是 MySQL 性能优化的重点可以介绍索引的创建原则、覆盖索引、最左前缀匹配原则等。如果能结合你项目的实际应用来说明如何选择合适的索引会更加分一些。表结构优化 优化表结构设计包括选择合适的字段类型、避免冗余字段、合理使用范式和反范式设计等等。SQL 优化 避免使用 SELECT *、尽量使用具体字段、使用连接查询代替子查询、合理使用分页查询、批量操作等都是 SQL 编写过程中需要注意的细节。 3. 进阶方案架构优化 当面试官对基础优化知识比较满意时可能会深入探讨一些架构层面的优化方案。以下是一些常见的架构优化策略 读写分离 将读操作和写操作分离到不同的数据库实例提升数据库的并发处理能力。分库分表 将数据分散到多个数据库实例或数据表中降低单表数据量提升查询效率。但要权衡其带来的复杂性和维护成本谨慎使用。数据冷热分离根据数据的访问频率和业务重要性将数据分为冷数据和热数据冷数据一般存储在存储在低成本、低性能的介质中热数据高性能存储介质中。缓存机制 使用 Redis 等缓存中间件将热点数据缓存到内存中减轻数据库压力。这个非常常用提升效果非常明显性价比极高 4. 其他优化手段 除了慢 SQL 定位、索引优化和架构优化还可以提及一些其他优化手段展示你对 MySQL 性能调优的全面理解 连接池配置 配置合理的数据库连接池如 连接池大小、超时时间 等能够有效提升数据库连接的效率避免频繁的连接开销。硬件配置 提升硬件性能也是优化的重要手段之一。使用高性能服务器、增加内存、使用 SSD 硬盘等硬件升级都可以有效提升数据库的整体性能。 5.总结 在面试中建议按优先级依次介绍慢 SQL 定位、索引优化、表结构设计和 SQL 优化等内容。架构层面的优化如读写分离和分库分表、数据冷热分离 应作为最后的手段除非在特定场景下有明显的性能瓶颈否则不应轻易使用因其引入的复杂性会带来额外的维护成本。
http://www.dnsts.com.cn/news/149833.html

相关文章:

  • 电子商务网站建设与维护 书做花型设计哪个网站下载素材好
  • 玉山县建设局网站做网站朋友圈广告的文案怎么写
  • wordpress网站目录短网址还原在线生成
  • 网站关键词优化费用网站设计的一般流程是什么
  • 韩国网站怎么打开苏州网站建设系统哪家好
  • 广西建网站哪家好网站制作风格类型
  • 专注徐州网站开发学院网站建设进度情况说明
  • 城阳网站建设哪里有手机上怎么提取公积金
  • 建筑工程有限公司电话宁德seo推广
  • 网站怎么申请百度小程序美术馆网站建设总体要求
  • 为网站制定推广计划昭通建设局网站
  • 网站运营建站优化专家wordpress 获取title
  • 英文网站正在建设页面php网站怎么样
  • 做海报可以借鉴的网站asp网站开发书籍
  • 视频网站闪图怎么做中国建设工程造价网
  • 网络营销网站建设的角度网站建设登录界面设计步骤
  • 网站开发人员晋升体系蚌埠网站制作公司价格
  • 网站版式舆情分析是个什么行业
  • 做跨境电商需要什么条件深圳白帽优化
  • 重庆企业的网站建设怎样搞网络营销
  • 山西网站建设运营公司太原seo顾问
  • 中国工商银行网站建设wordpress丢失网络连接
  • 承接设计网站建设网站链接到邮箱怎么做
  • 我的世界做视频封面的网站亚马逊品牌官网建设
  • 一级a做片性视频.网站在线观看如何自己开发软件app
  • 网站建设侵权wordpress栏目页调用内容
  • 深圳app开发公司排名seo外包顾问
  • wordpress网站做成app6学做网站可以赚钱吗
  • 自建网站的劣势做计划网站
  • 网站备案公司青岛网站seo