MySQL如何避免重复插入数据?
方式一:使用UNIQUE约束 在表的相关列上添加UNIQUE约束,确保每个值在该列中唯一。例如:
CREATE TABLE users
(
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) UNIQUE,
name VARCHAR(255)
);
如果尝试插入重复的email,MySQL会返回错误。
方式二:使用INSERT ... ON DUPLICATE KEY UPDATE 这种语句允许在插入记录时处理重复键的情况。如果插入的记录与现有记录冲突,可以选择更新现有记录:
INSERT INTO users
(email, name)
VALUES
('example@example.com', 'John Doe')
ON DUPLICATE KEY UPDATE name = VALUES(name);
方式三:使用INSERT IGNORE: 该语句会在插入记录时忽略那些因重复键而导致的插入错误。例如:
INSERT IGNORE INTO users
(email, name)
VALUES
('example@example.com', 'John Doe');
如果email已经存在,这条插入语句将被忽略而不会返回错误。 选择哪种方法取决于具体的需求: 如果需要保证全局唯一性,使用UNIQUE约束是最佳做法。 如果需要插入和更新结合可以使用ON DUPLICATE KEY UPDATE。 对于快速忽略重复插入,INSERT IGNORE是合适的选择。
MySQL 中 in 和 exists 的区别?
MySQL中的 in语句是把外表和内表作hash连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。我们可能认为 exists 比 in 语句的效率要高,这种说法其实是不准确的,要区分情景:如果查询的两个表大小相当,那么用in和 exists 差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用 exists,子查询表小的用 in。
not in 和 not exists:如果查询语句使用了 not in,那么内外表都进行全表扫描,没有用到索引;而 not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用 not exists 都比 not in 要快。
UNION 与 UNION ALL 的区别?
如果使用UNION,会在表链接后筛选掉重复的记录行
如果使用UNION ALL,不会合并重复的记录行
从效率上说,UNION ALL要比UNION快很多,如果合并没有刻意要删除重复行,那么就使用UNION All
MySQL 逻辑架构图主要分三层:
客户端:最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。
Server层:大多数MySQL的核心服务功能都在这一层,包括查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
存储引擎层:第三层包含了存储引擎。存储引擎负责 MySQL 中数据的存储和提取。Server 层通过 API 与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。

一条SQL查询语句在MySQL中如何执行的?
先检查该语句 是否有权限,如果没有权限,直接返回错误信息,如果有权限会先查询缓存(MySQL8.0 版本以前)。
如果没有缓存,分析器进行 语法分析,提取 sql 语句中 select 等关键元素,然后判断 sql 语句是否有语法错误,比如关键词是否正确等等。
语法解析之后,MySQL 的服务器会对查询的语句进行优化,确定执行的方案。
完成查询优化后,按照生成的执行计划 调用数据库引擎接口,返回执行结果。
redo log 怎么刷入磁盘的知道吗?
redo log的写入不是直接落到磁盘,而是在内存中设置了一片称之为 redo log buffer的连续内存空间,也就是redo日志缓冲区。
慢 SQL 如何定位呢?
慢 SQL 的监控主要通过两个途径:
慢查询日志:开启MySQL 的慢查询日志,再通过一些工具比如 mysqldumpslow 去分析对应的慢查询日志,当然现在一般的云厂商都提供了可视化的平台。
服务监控:可以在业务的基建中加入对慢SQL的监控,常见的方案有字节码插桩、连接池扩展、ORM框架过程,对服务运行中的慢SQL进行监控和警告。


被折叠的 条评论
为什么被折叠?



