<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>MySQL on withdong02</title>
    <link>https://withdong02.top/tags/mysql/</link>
    <description>Recent content in MySQL on withdong02</description>
    <image>
      <title>withdong02</title>
      <url>https://withdong02.top/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://withdong02.top/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sat, 06 Dec 2025 16:17:23 +0000</lastBuildDate>
    <atom:link href="https://withdong02.top/tags/mysql/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>MySQL锁机制八股整理</title>
      <link>https://withdong02.top/posts/mysql%E9%94%81%E6%9C%BA%E5%88%B6%E5%85%AB%E8%82%A1%E6%95%B4%E7%90%86/</link>
      <pubDate>Sat, 06 Dec 2025 16:17:23 +0000</pubDate>
      <guid>https://withdong02.top/posts/mysql%E9%94%81%E6%9C%BA%E5%88%B6%E5%85%AB%E8%82%A1%E6%95%B4%E7%90%86/</guid>
      <description>&lt;p&gt;整理一下&lt;code&gt;MySQL&lt;/code&gt;锁的八股，全文整理自&lt;a href=&#34;https://javabetter.cn/sidebar/sanfene/mysql.html#_53-%F0%9F%8C%9Fmysql-%E4%B8%AD%E6%9C%89%E5%93%AA%E5%87%A0%E7%A7%8D%E9%94%81&#34;&gt;二哥博客&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;在MySQL数据库中，锁是用来协调多个进程或线程并发访问同一资源的机制。锁不仅保证了数据的一致性和有效性，而且是影响数据库并发访问性能的一个重要因素。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image-20251206162234600&#34; loading=&#34;lazy&#34; src=&#34;https://dongimagehost-1356670526.cos.ap-nanjing.myqcloud.com/2025/07/image-20251206162234600.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;共享锁与排他锁&#34;&gt;共享锁与排他锁&lt;/h2&gt;
&lt;p&gt;共享锁也叫 S(shared) 锁，允许多个事务进行读操作，阻塞写操作。&lt;/p&gt;
&lt;p&gt;排他锁也叫 X(exclusive) 锁，只允许一个事务进行读写操作，阻塞其他事务的读写操作。&lt;/p&gt;
&lt;p&gt;兼容性如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;image-20251206181825893&#34; loading=&#34;lazy&#34; src=&#34;https://dongimagehost-1356670526.cos.ap-nanjing.myqcloud.com/2025/07/image-20251206181825893.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;表锁与行锁&#34;&gt;表锁与行锁&lt;/h2&gt;
&lt;p&gt;表锁：锁定整个表，资源开销小，加锁快，但并发度低，不会出现死锁，适合查询为主、少量更新的场景（如 MyISAM 引擎）。可以细分为表级S锁、表级X锁。&lt;/p&gt;
&lt;p&gt;行锁：锁定单行或多行，开销大、加锁慢，可能出现死锁，但并发度高（InnoDB 默认支持）。可以细分为记录锁、间隙锁、临键锁，也可以分为共享锁和排他锁（与表级S锁、表级X锁一个意思，前提是行锁）。&lt;/p&gt;
&lt;h3 id=&#34;表锁详细版&#34;&gt;表锁详细版：&lt;/h3&gt;
&lt;p&gt;表锁常见于 MyISAM 引擎， InnoDB 也可手动加锁，适合读多写少、全表扫描或者表结构变更的场景。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;LOCK&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TABLES&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;table_name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;READ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;-- 显式加读锁
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;select&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;-- 其他会话可读，不可写
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;UNLOCK&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TABLES&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;               &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;-- 释放锁
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;LOCK&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TABLES&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;table_name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;WRITE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;-- 显式加写锁 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;INSERT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;UPDATE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DELETE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;table_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;-- 其他会话读写均阻塞 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;UNLOCK&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TABLES&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MyISAM 在执行 &lt;code&gt;SELECT&lt;/code&gt; 时会自动加读锁，执行 &lt;code&gt;INSERT/UPDATE/DELETE&lt;/code&gt; 时会加写锁。&lt;/p&gt;
&lt;p&gt;对于 InnoDB 引擎，无索引的 &lt;code&gt;UPDATE/DELETE&lt;/code&gt; 可能会导致锁升级为表锁。执行 &lt;code&gt;ALTER TABLE&lt;/code&gt; 时会自动加表锁，阻塞所有读写操作。&lt;/p&gt;
&lt;h3 id=&#34;行锁详细版&#34;&gt;行锁详细版：&lt;/h3&gt;
&lt;p&gt;行锁是 InnoDB 存储引擎中最细粒度的锁，它锁定表中的一行记录，允许其他事务访问表中的其他行。&lt;/p&gt;
&lt;p&gt;底层是通过给索引加锁实现的，这就意味着只有通过索引条件检索数据时，InnoDB 才能使用行级锁，否则会退化为表锁。&lt;/p&gt;</description>
    </item>
    <item>
      <title>MySQL索引八股整理</title>
      <link>https://withdong02.top/posts/mysql%E7%B4%A2%E5%BC%95%E5%85%AB%E8%82%A1%E6%95%B4%E7%90%86/</link>
      <pubDate>Mon, 24 Nov 2025 15:14:51 +0000</pubDate>
      <guid>https://withdong02.top/posts/mysql%E7%B4%A2%E5%BC%95%E5%85%AB%E8%82%A1%E6%95%B4%E7%90%86/</guid>
      <description>&lt;p&gt;整理一下&lt;code&gt;MySQL&lt;/code&gt;索引的八股。&lt;/p&gt;
&lt;h2 id=&#34;索引介绍&#34;&gt;索引介绍&lt;/h2&gt;
&lt;p&gt;索引是数据库中用于加速查询的数据结构，通过对表中某列或多列的值进行排序，可以快速定位所要查找的数据。就像小时候在汉语字典里查字时，会先根据偏旁笔画数找到偏旁，然后根据剩余笔画找到目标字，这比在整个字典中一个一个查找是快很多的。&lt;/p&gt;
&lt;h2 id=&#34;索引分类&#34;&gt;索引分类&lt;/h2&gt;
&lt;p&gt;索引有以下分类&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;索引详细介绍&#34;&gt;索引详细介绍&lt;/h2&gt;
&lt;h3 id=&#34;主键索引&#34;&gt;主键索引：&lt;/h3&gt;
&lt;p&gt;主键索引用于唯一标识表中的每条记录，其值必须唯一且非空。每个表只允许有一个主键索引，一般为表中的自增id。&lt;/p&gt;
&lt;p&gt;创建主键时，数据库会自动生成主键索引。若没有指定主键，&lt;code&gt;MySQL&lt;/code&gt;的&lt;code&gt;InnoDB&lt;/code&gt;存储引擎会优先选择一个非空的唯一索引作为主键，如果没有符合条件的索引，&lt;code&gt;MySQL&lt;/code&gt;会自动生成一个隐藏的聚簇索引。&lt;/p&gt;
&lt;h3 id=&#34;唯一索引&#34;&gt;唯一索引：&lt;/h3&gt;
&lt;p&gt;主键索引 = 唯一索引 + 非空，每个表可以有多个唯一索引，同时唯一索引允许值为NULL，这是和主键索引不同的地方。唯一索引强制字段值的唯一性，插入或更新时会触发唯一检查，适用于业务唯一性约束的字段，比如邮箱。在建表定义唯一键时，会自动生成唯一索引。&lt;/p&gt;
&lt;p&gt;键和索引的区别在于键是逻辑概念，而索引是物理实现，在磁盘中有着实际的存储。&lt;/p&gt;
&lt;h3 id=&#34;普通索引&#34;&gt;普通索引：&lt;/h3&gt;
&lt;p&gt;普通索引仅用于加速查询，不会限制字段值的唯一性。&lt;/p&gt;
&lt;h3 id=&#34;全文索引&#34;&gt;全文索引&lt;/h3&gt;
&lt;p&gt;全文索引是&lt;code&gt;MySQL&lt;/code&gt;一种优化文本数据检索的特殊类型索引，适用于&lt;code&gt;CHAR, VARCHAR, TEXT&lt;/code&gt;等字段。MySQL 5.7 及以上版本内置了 ngram 解析器，可处理中文、日文和韩文等分词。全文索引底层不再是 B+ 树索引。&lt;/p&gt;
&lt;p&gt;建表时通过 &lt;code&gt;FULLTEXT (title, body)&lt;/code&gt; 来定义。通过 &lt;code&gt;MATCH(col1, col2) AGAINST(&#39;keyword&#39;)&lt;/code&gt; 进行检索，默认按照降序返回结果，支持布尔模式查询。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt; 表示必须包含；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-&lt;/code&gt; 表示排除；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*&lt;/code&gt; 表示通配符；&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 使用布尔模式查询
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;articles&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;WHERE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;MATCH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AGAINST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;+MySQL -Oracle&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IN&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;BOOLEAN&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;MODE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样查询性能比&lt;code&gt;LIKE &#39;%keyword%&#39;&lt;/code&gt;高很多。对于复杂的中文场景可以用&lt;code&gt;Elasticsearch&lt;/code&gt;等专业搜索引擎替代。&lt;/p&gt;
&lt;h3 id=&#34;b-树索引&#34;&gt;B+ 树索引：&lt;/h3&gt;
&lt;p&gt;B+ 树是一种高度平衡的多路查找树，能有效降低磁盘的 IO 次数，并且支持有序遍历和范围查询。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
