欢迎光临
我们一直在努力

MySQL:(0) MySQL基础

1. innodb 引擎的 4大特性

innodb 引擎的4大特性 1.插入缓冲; 2.二次写; 3.自适应哈希; 4.预读

  • 插入缓冲(Insert Buffer) 针对非唯一二级索引的插入操作进行优化,当新记录需要插入到非连续的索引页时,InnoDB 不直接写入磁盘,而是先将其暂存于内存中的“插入缓冲”链表里;随后在后台线程空闲或页面被读取时,再将这些分散的插入操作合并为一次顺序 I/O 写入磁盘,从而将大量的随机写转化为顺序写,显著提升写性能。
  • 二次写(Double Write) 为解决数据库发生崩溃(如断电)时,因页写入磁盘过程不完整(仅写了一半,即“页断裂”)而导致的数据损坏问题而设计;InnoDB 在将脏页刷新到正式表空间前,会先将其顺序写入一个名为"doublewrite buffer"的共享区域,若恢复时发现数据页损坏,可从该缓冲区中找回完整的副本进行修复,确保数据的可靠性。
  • 自适应哈希索引(Adaptive Hash Index) InnoDB 会监控索引页的访问频率,对于某些被频繁热点访问的页,自动在内存中为其建立哈希索引;这使得原本需要通过 B+ 树多层遍历的查询,可以直接通过哈希表实现 O(1) 复杂度的等值查找,无需人工干预即可动态加速热点数据的检索速度。
  • 预读(Read Ahead) 基于局部性原理设计的 I/O 优化策略,当检测到系统正在顺序访问某个区(Extent)中的部分数据页时,InnoDB 会预测后续即将需要的数据,并主动在后台异步地将该区剩余的页提前加载到缓冲池(Buffer Pool)中;这样当用户真正请求这些数据时,可直接从内存命中,避免了等待磁盘 I/O 的延迟。
  • 2. Mysql 中有哪些不同的表格

    2.1 InnoDB (默认)

    • 地位:MySQL 5.5 版本后的默认引擎。
    • 核心特性:
      • 支持事务处理 (ACID 兼容)。
      • 支持行级锁 (Row-level locking),高并发写入性能极佳。
      • 支持外键约束 (Foreign Keys)。
      • 支持崩溃恢复 (Crash Recovery)。
    • 适用场景:绝大多数需要事务安全、高并发读写的应用场景(如电商订单、用户系统)。
    • 缺点:相比 MyISAM,占用更多磁盘空间,全表扫描速度略慢(但在现代硬件上差异不大)。

    2.2 MyISAM (旧版默认)

    • 地位:MySQL 5.5 之前的默认引擎,目前主要用于遗留系统或特定只读场景。
    • 核心特性:
      • 不支持事务和外键。
      • 使用表级锁 (Table-level locking),写入时会锁住整张表,并发性能差。
      • 读取速度快,尤其是 COUNT(*) 操作(因为内部维护了行数计数)。
      • 支持全文索引 (Full-text Index)(注:InnoDB 在 5.6+ 也支持了)。
    • 适用场景:只读或读多写少、不需要事务安全的日志记录、数据仓库报表。
    • 缺点:表损坏后修复困难,不支持事务,高并发写入瓶颈明显。

    2.3 Memory (Heap)

    • 地位:基于内存的临时表引擎。
    • 核心特性:
      • 数据存储在RAM中,速度极快。
      • 重启后数据丢失(易失性)。
      • 默认使用哈希索引(Hash Index),适合等值查询,不适合范围查询。
      • 表大小受限于 max_heap_table_size。
    • 适用场景:临时中间表、缓存查找表、会话存储。
    • 缺点:数据不安全(断电即失),受内存大小限制。

    2.4 Archive

    • 地位:专为归档设计。
    • 核心特性:
      • 采用高压缩比存储,节省空间。
      • 只支持插入和查询,不支持更新 (UPDATE) 和删除 (DELETE)。
      • 不支持索引(除了自增主键)。
    • 适用场景:历史数据归档、日志长期存储。

    2.5 CSV

    • 地位:文本文件映射。
    • 核心特性:
      • 数据直接以逗号分隔值 (.csv) 文件形式存储在磁盘上。
      • 可以用文本编辑器直接查看和修改。
      • 不支持索引和事务。
    • 适用场景:数据交换、作为外部数据源的接口。

    2.6 Blackhole (黑洞)

    • 地位:特殊用途引擎。
    • 核心特性:
      • 接收所有写入操作,但不存储任何数据,查询永远返回空集。
      • 会记录二进制日志 (Binlog)。
    • 适用场景:主从复制中的中继节点(只转发数据不存储)、审计测试(测试 SQL 语法而不影响数据)。

    2.7 Federated

    • 地位:远程访问引擎。
    • 核心特性:
      • 本地不存数据,指向远程 MySQL 服务器上的表。
      • 像访问本地表一样访问远程表。
    • 适用场景:分布式数据库查询(性能较差,需谨慎使用)。

    3. myisam 与 innodb 的区别

    3.1 存储架构与空间效率

    特性

    MyISAM

    InnoDB

    文件组成

    3个文件:

    • .frm (表结构)
    • .MYD (数据 Data)
    • .MYI (索引 Index)

    2类文件:
    • .frm (表结构,MySQL 8.0后消失)
    • .ibd (数据+索引,共享表空间或独立表空间)

    存储结构

    索引与数据分离。索引有压缩,节省空间。

    索引与数据捆绑(聚簇索引)。数据即索引,索引即数据,无压缩,体积通常较大。

    内存管理

    依赖操作系统缓存,自身无专用缓冲池。

    拥有专用的 Buffer Pool,在内存中缓存数据和索引,对内存要求高。

    空间优势

    适合读多写少、存储空间敏感的场景。

    适合高并发、事务安全、内存充足的场景。

    3.2 事务、外键与锁

    特性

    MyISAM

    InnoDB

    事务支持

    ❌ 不支持。无法回滚,不保证 ACID。

    ✅ 支持。完整支持 ACID 事务,支持回滚、提交。

    外键支持

    ❌ 不支持。

    ✅ 支持。可定义外键约束,保证数据一致性。

    锁机制

    表级锁 (Table Lock)。
    • 任何写操作(INSERT/UPDATE/DELETE)都会锁全表。
    • 读操作(SELECT)也会加共享锁。
    • 并发写入性能差。

    行级锁 (Row Lock) (默认)。
    • 仅锁定受影响的行,并发性能极高。
    • 注意:通过给索引上的索引项加锁来实现,若查询条件无法利用索引(如 LIKE '%aaa'),会退化为表锁。

    3.3 操作差异

    场景/操作

    MyISAM 表现

    InnoDB 表现

    备注

    读操作 (SELECT)

     极快。适合以读为主的业务。

    相对较慢(需维护事务日志和锁)。

    大量 SELECT 选 MyISAM。

    写操作 (INSERT/UPDATE)

    较慢(表锁阻塞)。

    较快。行锁允许高并发写入。

    大量写操作必选 InnoDB。

    清空表 (DELETE)

    重建表。速度极快,但碎片整理耗时。

    逐行删除。速度慢,消耗大。

    InnoDB 清空大表请用 TRUNCATE TABLE。

    统计行数 (COUNT)

    O(1)。内部保存了总行数,直接读取。

    O(N)。需遍历全表(因 MVCC 机制,不同事务看到的行数不同)。

    COUNT(*) 大数据量下 InnoDB 极慢。

    自增列 (AUTO_INC)

    灵活。可以是联合索引的非第一列。

    严格。必须是索引,且若是联合索引必须是第一列。

    InnoDB 依赖自增列顺序写入优化。

    例:一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,
    再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?

    (1)如果表的类型是MyISAM,那么是18 
    因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大
    ID 也不会丢失 。

    (2)如果表的类型是InnoDB,那么是15 
    InnoDB 表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行
    OPTIMIZE 操作,都会导致最大ID丢失 。

    3.4 全文索引与崩溃恢复

    特性

    MyISAM

    InnoDB

    全文索引

    原生支持 (FULLTEXT)。
    早期版本不支持中文分词。

    5.6之前不支持。
    5.6+ 原生支持 FULLTEXT。
    复杂中文搜索常配合 Sphinx 或 Elasticsearch。

    崩溃恢复

    较差。断电易损坏,修复困难。

    优秀。通过 Redo Log 实现崩溃恢复,数据安全性高。

    4. InnoDB 支持的四种事务隔离级别

    • read uncommited :读未提交
    • read committed:读已提交
    • repeatable read:可重读
    • serializable :串行化
  • Read Uncommitted(读未提交) 这是最低的隔离级别,允许一个事务读取另一个事务尚未提交的修改数据;这会导致“脏读”(Dirty Read)问题,即读到了别人回滚前的临时无效数据,实际生产中极少使用。
  • Read Committed(读已提交) 保证一个事务只能读取到已经提交的数据,解决了脏读问题;但在同一事务内,两次读取同一数据可能因其他事务的提交修改而得到不同结果,因此仍存在“不可重复读”(Non-repeatable Read)问题,是 Oracle 和 SQL Server 的默认级别。
  • Repeatable Read(可重复读) 保证在同一事务内,多次读取同一数据的结果始终一致,即使其他事务已提交修改也不会影响当前视图,从而解决了不可重复读问题;这是 MySQL InnoDB 的默认隔离级别,并通过 MVCC 和间隙锁(Gap Lock)在很大程度上避免了“幻读”(Phantom Read)。
  • Serializable(串行化) 这是最高的隔离级别,强制事务串行执行(相当于给所有读取的数据加上共享锁,写入加排他锁),彻底解决了脏读、不可重复读和幻读所有并发问题;但代价是极大的性能损耗和并发能力下降,通常仅在对数据一致性要求极高且并发量低的场景使用。
  • 5. 数据库优化相关操作

    1. 用PreparedStatement, 一般来说比Statement性能高:一个sql 发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。

    2. 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。

    3. 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等

    4. UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。

    特性

    UNION

    UNION ALL

    重复处理

    自动去重 (删除完全相同的行)

    保留所有行 (包括重复数据)

    执行效率

    较慢
    (数据库需排序或哈希比对来查找重复项)

    极快
    (直接拼接结果集,无额外计算开销)

    适用场景

    需要确保结果集唯一性时

    确定无重复,或不在乎重复且追求速度时

    6. mysql 的复制原理以及流程

    • 主服务器 (Master):负责处理写操作,并将所有数据变更记录到二进制日志 (Binary Log) 中。
    • 从服务器 (Slave):负责读取并应用主服务器的变更,实现数据同步(可处理读操作,分担负载)。
  • 记录 (Log): 主服务器将所有的数据更新操作写入 Binary Log,并维护索引以跟踪日志位置。
  • 拷贝 (Copy): 从服务器连接主服务器,告知上次同步的位置;主服务器发送该位置之后的新日志;从服务器将其接收并保存到本地的 中继日志 (Relay Log) 中。
  • 重放 (Replay): 从服务器读取中继日志中的事件,重新执行这些 SQL 操作,从而将变更应用到自己的数据库中,保持与主服务器一致。从服务器在执行完中继日志后,会阻塞等待主服务器的新通知,形成循环监听机制。
  • 7. mysql 支持的复制类型

    1. 基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。 一旦发现没法精确复制时,会自动选着基于行的复制。 

    2. 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持 

    3. 混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。 

    8. 索引种类与工作机制

  • 普通索引: 即针对数据库表创建索引 
  • 唯一索引: 与普通索引类似,不同的就是:MySQL数据库索引列的值,必须唯一,但允许有空值 
  • 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引 
  • 组合索引: 为了进一步榨取MySQL的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。 
  • 工作机制:使用B树及其变种B+树。

    • B 树 (B-Tree):
      • 数据存储:每个节点(包括根节点、内部节点、叶子节点)都存储 键 (Key) + 数据 (Data)。
      • 查找逻辑:只要在某个节点找到匹配的 Key,就可以直接返回数据,无需走到叶子节点。
    • B+ 树 (B+ Tree):
      • 数据存储:只有叶子节点存储 键 (Key) + 数据 (Data);非叶子节点(内部节点)只存储键 (Key) 作为索引指引。
      • 链表结构:所有叶子节点通过双向指针连接成一个有序链表。

    特性

    B 树

    B+ 树 (MySQL 选择)

    优势解析

    磁盘 I/O 次数

    较多

    更少

    B+ 树非叶子节点不存数据,单个磁盘页能容纳更多索引键,树的高度更低,查询时读取磁盘的次数更少。

    范围查询性能

    极优

    B+ 树叶子节点有链表连接,范围查询只需找到起点,然后沿链表遍历即可;B 树需要反复进行中序遍历,效率低。

    查询稳定性

    不稳定

    稳定

    B 树查询最好在根节点命中,最坏在叶子节点;B+ 树所有查询都必须走到叶子节点,耗时固定,性能可预测。

    全表扫描

    B+ 树只需遍历叶子节点链表;B 树需要递归遍历整棵树。

    空间利用率

    较低

    较高

    B+ 树内部节点只存 Key,空间利用率高,能建立更宽更矮的树。

    9. MySQL中控制内存分配的全局参数,有哪些?

    9.1 核心共享内存(全局唯一,直接影响总占用)

    • innodb_buffer_pool_size:最重要。InnoDB 引擎的数据和索引缓存区。通常设置为物理内存的 50%-70%。
    • key_buffer_size:MyISAM 引擎的索引缓存区(若不用 MyISAM 可设小)。
    • query_cache_size:查询缓存(MySQL 8.0 已移除,5.7 及以下建议关闭)。
    • innodb_log_buffer_size:InnoDB 重做日志(Redo Log)的缓冲区。

    9.2 每线程/连接内存(全局设定上限,实际占用 = 参数值 × 并发连接数)

    • sort_buffer_size:排序操作(ORDER BY, GROUP BY)使用的缓冲区。
    • read_buffer_size:顺序读操作的缓冲区。
    • read_rnd_buffer_size:随机读操作(如排序后读行)的缓冲区。
    • join_buffer_size:表连接(JOIN)不使用索引时的缓冲区。
    • tmp_table_size / max_heap_table_size:内存临时表的最大大小(超过则转磁盘)。
    • thread_stack:每个线程的栈空间大小。

    10. 表中有大字段如:text类型,且字段不会经常更新,以读为主,将该字段拆成子表好处是什么?

  • 减少 I/O 开销:主表行宽变窄,单次磁盘读取可加载更多有效数据行,减少物理 I/O 次数。
  • 提高缓存命中率:更多热点数据(非大字段部分)能放入内存缓冲池(Buffer Pool),避免大字段挤占宝贵内存。
  • 加速索引扫描:若主表需全表扫描或覆盖索引查询,避开大字段可显著降低数据传输量,提升速度。
  • 按需加载:仅在真正需要查看大字段内容时才关联子表,符合“读为主但非每次必读”的场景。
  • 11. insert、update 的 select 语句语法

    11.1 INSERT … SELECT (批量插入)

    INSERT INTO 目标表 (列 1, 列 2)
    SELECT 列 A, 列 B
    FROM 源表
    WHERE 条件;

    11.2 UPDATE … JOIN (多表更新)

    MySQL 不支持直接在 UPDATE 后跟 SELECT 子句(如 UPDATE t SET col = (SELECT…) 效率低且有限制),标准做法是使用 JOIN。

    根据另一张表的统计值或关联值更新当前表:

    UPDATE 目标表 AS t1
    JOIN 源表 AS t2 ON t1.id = t2.id
    SET t1.列名 = t2.列名
    WHERE 条件;

    替代写法 (子查询):仅适用于单行单列返回,性能较差。

    UPDATE 目标表
    SET 列名 = (SELECT 值 FROM 源表 WHERE …)
    WHERE 条件;

    11.3 当记录不存在时 insert,当记录存在时 update

    核心前提:目标表必须拥有 主键 或 唯一索引。只有当插入的值违反了唯一性约束时,才会触发更新逻辑。

    INSERT INTO 表名 (id, col1, col2)
    VALUES (1, '值 A', '值 B')
    ON DUPLICATE KEY UPDATE
    col1 = VALUES(col1),
    col2 = VALUES(col2);

    12. 其他问题

    12.1 数据库三范式

    列唯一、主键唯一、其他列必须直接依赖主键,非主键之间不能有依赖。

    12.2 若一张表中只有一个字段 VARCHAR(N) 类型,utf8编码,则N最大值?精确到数量级即可 

    由于 utf8 的每个字符最多占用3个字节。而MySQL定义行的长度不能超过 65535,因此N的最大值计算方法为:(65535-1-2)/3。减去1的原因是实际存储从第二个字节开始,减去2的原因是因为要在列表长度存储实际的字符长度,除以3是因为utf8限制:每个字符最多占用3个字节。

    12.3 Heap 表

    HEAP 表存在于内存中,用于临时高速存储。

    • BLOB 或TEXT字段是不允许的;
    • 只能使用比较运算符=,,=>,= <;
    • HEAP 表不支持AUTO_INCREMENT,索引不可为NULL。

    12.4 如何控制HEAP表的最大尺寸

    通过称为max_heap_table_size的Mysql配置变量来控制。

    12.5 默认端口 3306

    12.6 [SELECT *] 和[SELECT 全部字段]的2种写法有何优缺点

    特性

    SELECT *

    SELECT 字段 1, 字段 2…

    优点

    1. 开发快:无需列举所有字段。
    2. 适应性强:表结构变更(加列)时代码无需修改。

    1. 性能高:只取所需数据,减少网络传输和 I/O。
    2. 可利用覆盖索引:若查询列都在索引中,无需回表,速度极快。
    3. 稳定性好:不受表结构变更影响(如新增大字段不会拖慢旧查询)。
    4. 可读性高:明确知道业务需要哪些数据。

    缺点

    1. 性能差:无法利用覆盖索引,必然回表;若含大字段(TEXT/BLOB),IO 爆炸。
    2. 网络浪费:传输无用数据。
    3. 隐患大:若表增加了大字段,原有简单查询可能突然变慢。
    4. 列顺序不确定:依赖数据库元数据顺序,代码耦合度高。

    1. 维护稍繁:表结构变更时需同步修改 SQL。
    2. 代码较长:字段多

    12.7 HAVNG 子句 和 WHERE的异同点

    特性

    WHERE

    HAVING

    执行时机

    分组前过滤 (先过滤,再分组)

    分组后过滤 (先分组,再过滤)

    作用对象

    原始数据行 (Rows)

    分组后的聚合结果 (Groups)

    聚合函数

    不可用 (如 SUM, COUNT)

    可用 (专门用于判断聚合值)

    性能影响

    高效 (减少参与分组的数据量)

    较低 (需先完成所有分组计算)

    典型场景

    WHERE age > 18

    HAVING COUNT(*) > 5

    FROM → WHERE (过滤行) → GROUP BY (分组) → HAVING (过滤组) → SELECT → ORDER BY

    12.8 FLOAT和DOUBLE区别

    FLOAT,8位精度,有四个字节。 
    DOUBLE,18位精度,有八个字节。

    12.9 CHAR_LENGTH和LENGTH区别

    CHAR_LENGTH 是字符数,而LENGTH是字节数。Latin字符的这两个数据是相同的,但是对于Unicode 和其他编码,它们是不同的。

    12.10 CHAR 和VARCHAR的区别

    • CHAR 是定长字符串,长度固定(如 CHAR(10)始终占用 10 个字符的空间,不足部分用空格填充),适合存储长度固定的数据(如手机号、国家代码)。
    • VARCHAR 是变长字符串,仅占用实际字符长度 + 1/2 字节(记录长度),适合存储长度变化较大的数据(如用户名、地址),更节省空间。

    12.11 LIKE 和 REGEXP 操作区别

    特性

    LIKE

    REGEXP (正则表达式)

    匹配能力

    简单模糊匹配

    复杂模式匹配

    通配符

    仅支持 % (任意字符序列) 和 _ (单字符)

    支持完整正则语法 (^, $, [], *, +, ?, `

    匹配位置

    默认匹配字符串任意位置 (除非手动加 %)

    可精确控制匹配开头 (^)、结尾 ($) 或特定结构

    性能效率

    高 (若前缀无 %,可利用索引)

    低 (通常无法利用普通索引,需全表扫描)

    12.12 BLOB 和TEXT 区别

    特性

    BLOB (Binary Large Object)

    TEXT

    数据类型

    二进制字节串

    非二进制字符串

    字符集

    无字符集概念,按字节存储

    有字符集(如 utf8mb4),按字符存储

    大小写敏感

    区分大小写 (Case Sensitive)

    默认不区分 (取决于排序规则 Collation)

    排序/比较

    基于字节值比较

    基于字符集规则比较(可忽略大小写、重音等)

    典型用途

    图片、视频、音频、加密数据、压缩包

    文章、评论、日志、HTML 代码等文本内容

    12.13 主键和候选键区别

    主键是从候选键中选择的、用于唯一标识表中每个记录的一个特定键(不允许 NULL 值)。候选键是表中所有能唯一标识记录的一个或多个字段集合(都满足唯一性且最小),主键是其中被“选定”的那个键,每个表只能有一个主键。

    12.14 TIMESTAMP 在UPDATE CURRENT_TIMESTAMP 数据类型上做什么

    TIMESTAMP列如果设置了 ON UPDATE CURRENT_TIMESTAMP,会在该行数据发生任何更新时,自动将该列的值更新为当前时间戳

    12.15 myisamchk 是用来做什么的

    myisamchk是 MySQL 中一个用于检查、修复、优化和描述 MyISAM 表的命令行工具。它直接在物理表文件(.MYD、.MYI)上操作,因此在使用前需确保相关表未被服务器使用(或服务器已停止)。主要功能包括检查表错误、修复损坏的表、压缩索引、获取表信息等。

    12.16 MyISAM Static 和 MyISAM Dynamic 区别

    MyISAM Static(静态表)​ 和 MyISAM Dynamic(动态表)​ 是 MyISAM 存储引擎的两种表格式,主要区别在于列存储方式:

    • Static(静态):表中所有行都使用固定的存储长度。如果声明的列是 CHAR 或固定长度的类型,它总是静态的。即使 VARCHAR 列,如果表中没有 BLOB/TEXT,且所有 VARCHAR 列都声明了足够大的长度,MySQL 也可能将其转为静态格式以提升性能。

    • Dynamic(动态):表中包含可变长度列(如 VARCHAR、BLOB、TEXT),每行仅存储实际数据长度,节省空间但可能产生碎片。

    简单说:静态表固定长度,查询稍快但可能浪费空间;动态表可变长度,节省空间但可能有碎片,频繁更新后需优化来整理碎片。

    12.17 NOW()和CURRENT_DATE()区别

    • NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。
    • CURRENT_DATE()仅显示当前年份,月份和日期。

    12.18 列设置为AUTO INCREMENT时,如果在表中达到最大值,会发生什么情况

    它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。

      12.19 怎样才能找出最后一次插入时分配了哪个自动增量

      LAST_INSERT_ID 将返回由 Auto_increment 分配的最后一个值,并且不需要指定表名称。

      12.20 获取当前的Mysql版本

      SELECT VERSION();用于获取当前 Mysql 的版本

      12.21 怎么看到为表格定义的所有索引

      SHOW INDEX FROM

      12.22 如何在Unix和Mysql时间戳之间进行转换

      • UNIX_TIMESTAMP 是从 Mysql 时间戳转换为Unix时间戳的命令;
      • FROM_UNIXTIME 是从Unix 时间戳转换为Mysql时间戳的命令。

      12.23 如何得到受查询影响的行数

      SELECT COUNT (user_id) FROM users;

      12.24 Mysql 查询是否区分大小写

      不区分

      12.25 ENUM的用法

      ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。 Create table size(name ENUM('Smail,'Medium','Large');

      12.26 如何在mysql中运行批处理模式

      mysql -u 用户名 -p 数据库名 < 脚本文件.sql
      mysql> source /path/to/脚本文件.sql;
      — 或者简写为
      mysql> \\. /path/to/脚本文件.sql;

      12.27 ISAM 是什么

      ISAM (Indexed Sequential Access Method,索引顺序访问方法) 是 MySQL 早期(2006年以前)使用的一种存储引擎。

      12.28 Mysql 如何优化DISTINCT

      DISTINCT 是 SQL 中的关键字,用于过滤查询结果中的重复行,确保返回的每一行数据都是唯一的。

      策略

      核心动作

      原理与效果

      1. 建立索引 (最关键)

      在 DISTINCT 涉及的列上建联合索引

      利用索引的有序性,直接跳过排序步骤,避免 Using temporary 和 Filesort。

      2. 限制字段

      SELECT DISTINCT col 而非 SELECT DISTINCT *

      减少去重计算的数据量,更容易命中覆盖索引。

      3. 改写 EXISTS

      将 SELECT DISTINCT … JOIN 改为 WHERE EXISTS

      若只需判断“是否存在”,EXISTS 找到一条即停止,比全量去重快得多。

      4. 替代 GROUP BY

      尝试用 GROUP BY 替换 DISTINCT

      在某些复杂聚合场景下,优化器对 GROUP BY 的处理可能更优(需 EXPLAIN 验证)。

      5. 业务层去重

      查出所有数据,在代码中用 Set/HashMap 去重

      适用于数据量小但 SQL 极复杂的场景,将压力从数据库转移到应用服务器。

      12.29 如何输入字符为十六进制数字

      场景

      语法/函数

      示例

      结果/说明

      1. 直接字面量

      0x 前缀

      SELECT 0x41;

      'A' (自动转为字符串/二进制)

      2. 字符串转 Hex

      HEX()

      SELECT HEX('A');

      '41' (返回十六进制字符串)

      3. Hex 转字符串

      UNHEX()

      SELECT UNHEX('41');

      'A' (还原为原始字符)

      4. 数值进制转换

      CONV()

      SELECT CONV(10, 10, 16);

      'A' (10 进制转 16 进制通用)

      5. 二进制显示

      HEX() + 列

      SELECT HEX(blob_col);

      将二进制字段以 Hex 形式查看

      12.30 如何显示前50行

      使用 LIMIT 50 子句,例如:SELECT * FROM 表名 LIMIT 50;

      12.31 可以使用多少列创建索引

      任何标准表最多可以创建16个索引列。

      12.32 Mysql 表中允许有多少个TRIGGERS?

      每个表最多支持 6 个触发器。

      组合逻辑为:2 种时机 (BEFORE, AFTER) × 3 种操作 (INSERT, UPDATE, DELETE) = 6 个。

      12.33 什么是非标准字符串类型

      通常指 SET 和 ENUM

      12.34 解释访问控制列表

      访问控制列表 (ACL) 在 MySQL 中是权限管理系统的核心数据结构。

      • 定义:它是服务器内存中缓存的一组表格,记录了所有用户账号及其对应的权限信息(如能访问哪些库、表、列,能执行什么操作)。
      • 工作原理:当用户发起连接或执行 SQL 时,MySQL 会将请求与 ACL 进行比对。只有匹配到允许规则,操作才会被执行;否则拒绝访问。
      • 来源:ACL 的内容来源于系统数据库 mysql 中的权限表(如 user, db, tables_priv 等)。
      • 刷新机制:执行 GRANT/REVOKE 命令或 FLUSH PRIVILEGES 时,ACL 会重新加载生效。

      12.35 mysql 里记录货币用什么字段类型好

      NUMERIC 和DECIMAL 类型(被Mysql实现为同样的类型)

      12.36 MYSQL 数据表在什么情况下容易损坏

      1. 硬件与系统故障 (最常见)

      • 突然断电:服务器在写入数据时突然断电,导致磁盘文件头或数据块写入不完整。
      • 磁盘坏道:硬盘物理损伤导致存储的数据位翻转或丢失。
      • 内存错误:RAM 故障导致写入磁盘的数据本身就是错误的。
      • 操作系统崩溃:OS 死机或强制重启,文件系统未正常同步。

      2. 不当的操作与管理

      • 强制杀死进程:在 MySQL 进行写操作时,使用 kill -9 强制杀掉 mysqld 进程,跳过正常的清理和关闭流程。
      • 直接操作文件:在 MySQL 服务运行时,直接在操作系统层面复制、移动、删除或修改 .frm, .MYD, .MYI (MyISAM) 或 .ibd (InnoDB) 文件。
      • 非正常关机:未执行 service mysql stop 而直接拔电源或重置虚拟机。

      12.37 mysql 有关权限的表都有哪几个

      权限表存放在mysql数据库里,由 mysql_install_db 脚本初始化。

      表名

      作用范围 (粒度)

      说明

      user

      全局级

      存储用户账号、主机信息及全局权限(如 SUPER, RELOAD)。决定用户能否登录。

      db

      数据库级

      存储用户对特定数据库的权限(如某用户对 test_db 有读写权)。

      tables_priv

      表级

      存储用户对特定表的权限(细粒度控制)。

      columns_priv

      列级

      存储用户对特定字段的权限(最细粒度,如只能查看某列)。

      procs_priv

      存储过程/函数级

      存储用户对存储过程和函数的执行权限。

      赞(0)
      未经允许不得转载:171主机测评 » MySQL:(0) MySQL基础
      分享到: 更多 (0)

      评论 抢沙发

      • 昵称 (必填)
      • 邮箱 (必填)
      • 网址