<?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>索引 on withdong02</title>
    <link>https://withdong02.top/tags/%E7%B4%A2%E5%BC%95/</link>
    <description>Recent content in 索引 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>zh</language>
    <lastBuildDate>Mon, 24 Nov 2025 15:14:51 +0000</lastBuildDate>
    <atom:link href="https://withdong02.top/tags/%E7%B4%A2%E5%BC%95/index.xml" rel="self" type="application/rss+xml" />
    <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;img src=&#34;https://dongimagehost-1356670526.cos.ap-nanjing.myqcloud.com/2025/07/image-20251124152320367.png&#34; alt=&#34;image-20251124152320367&#34; style=&#34;zoom: 25%;&#34; /&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;
&lt;p&gt;相比普通二叉树，B+ 树可以将亿级数据量控制在3-4层树高，极大减少磁盘的 I/O 次数。因为树越高意味着查找数据时就需要更多的磁盘 IO，因为每一层都可能需要从磁盘加载新的节点。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
