<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Database on Yeqown</title>
    <link>https://www.yeqown.xyz/categories/Database/</link>
    <description>Recent content in Database on Yeqown</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Tue, 31 Mar 2026 14:44:37 +0800</lastBuildDate>
    <atom:link href="https://www.yeqown.xyz/categories/Database/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>列式数据库是怎么炼成的</title>
      <link>https://www.yeqown.xyz/2026/03/31/%E5%88%97%E5%BC%8F%E6%95%B0%E6%8D%AE%E5%BA%93%E6%98%AF%E6%80%8E%E4%B9%88%E7%82%BC%E6%88%90%E7%9A%84/</link>
      <pubDate>Tue, 31 Mar 2026 14:44:37 +0800</pubDate>
      <guid>https://www.yeqown.xyz/2026/03/31/%E5%88%97%E5%BC%8F%E6%95%B0%E6%8D%AE%E5%BA%93%E6%98%AF%E6%80%8E%E4%B9%88%E7%82%BC%E6%88%90%E7%9A%84/</guid>
      <description>&lt;p&gt;列式数据库与行式数据库最大的区别在于数据的存储方式，也就是它们在磁盘上的组织方式不同。传统的行式数据库常用于 &lt;code&gt;OLTP (Online Transaction Processing)&lt;/code&gt; 场景，在这个场景下需要频繁的进行数据的插入、更新、删除操作，操作的对象往往是单行数据。而列式数据库常用于 &lt;code&gt;OLAP (Online Analytical Processing)&lt;/code&gt; 场景，对于数据的聚合查询更为常见，往往需要扫描某一列的大量数据进行计算。&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;  &lt;img src=&#34;https://www.yeqown.xyz/images/columnar-database/storage-difference.png&#34; alt=&#34;Storage Difference&#34;&gt;&#xA;  &lt;figcaption&gt;Storage Difference&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;如果同时用过两种类型的数据库，就会发现：&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;这里列举的优化原则只是冰山一角，仅用于说明两种数据库最显眼的差异。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;使用行式数据库过程中，最简单常见的优化原则就是 &lt;strong&gt;尽可能命中索引、降低 B+ 树高度、减少扫描行数&lt;/strong&gt;，如：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;优先对区分度高的列建立索引&lt;/li&gt;&#xA;&lt;li&gt;覆盖索引（索引中包含查询所需的所有列，避免回表）&lt;/li&gt;&#xA;&lt;li&gt;索引下推（在存储引擎层提前过滤不满足条件的数据）&lt;/li&gt;&#xA;&lt;li&gt;最左前缀匹配原则&lt;/li&gt;&#xA;&lt;li&gt;避免使用函数或者隐式类型转换（如：&lt;code&gt;where date(create_time) = &#39;2022-01-01&#39;&lt;/code&gt;），会导致索引失效&lt;/li&gt;&#xA;&lt;li&gt;避免在索引列上使用 &lt;code&gt;!=&lt;/code&gt;、&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; 等操作符，会导致索引失效&lt;/li&gt;&#xA;&lt;li&gt;避免深度分页&lt;/li&gt;&#xA;&lt;li&gt;分库分表（提出这一优化方向，也是基于单表数据量过大，索引维护的开销会增加，性能也会退化）&lt;/li&gt;&#xA;&lt;li&gt;等等&amp;hellip;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;减少扫描行数这一思路对于列式数据库同样适用（如分区裁剪），但列式数据库还有另一个很重要的优化方向，那就是 &lt;strong&gt;减少列&lt;/strong&gt;，如：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;行存特性（如果是点查询，列数据库 I/O 反而会增加，这一点和行式数据库正好相悖）&lt;/li&gt;&#xA;&lt;li&gt;只读取查询涉及的列（行存也提倡避免 SELECT *，但由于行存以行为单位读取磁盘，主要减少的是网络传输量而非磁盘 I/O；而列存中每列独立存储，少读一列就直接少一份磁盘 I/O）&lt;/li&gt;&#xA;&lt;li&gt;等等&amp;hellip;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;当然，任何数据库的优化，都逃不开 &lt;strong&gt;减少 I/O&lt;/strong&gt; 这一核心目的。说得更白话一点，如果有一种完美的存储介质，它没有I/O延迟，也不会丢失数据，那么这些优化也就不再需要了。&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-clickhouse-的设计&#34;&gt;1. ClickHouse 的设计&lt;a class=&#34;anchor&#34; href=&#34;#1-clickhouse-%e7%9a%84%e8%ae%be%e8%ae%a1&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;11-整体组件&#34;&gt;1.1 整体组件&lt;a class=&#34;anchor&#34; href=&#34;#11-%e6%95%b4%e4%bd%93%e7%bb%84%e4%bb%b6&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;从 ClickHouse 的架构图来看，列式数据库包含以下核心组件：&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;    &lt;img src=&#34;https://www.yeqown.xyz/images/columnar-database/clickhouse-architecture.png&#34; alt=&#34;ClickHouse Architecture&#34;&gt;&#xA;    &lt;figcaption&gt;ClickHouse Architecture&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;查询处理层&lt;/strong&gt;&lt;/em&gt;： 查询处理遵循传统范式：解析入站查询、构建并优化逻辑与物理查询计划，然后执行&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SQL Parser&lt;/li&gt;&#xA;&lt;li&gt;SQL Planner&lt;/li&gt;&#xA;&lt;li&gt;Physical Plan Builder&lt;/li&gt;&#xA;&lt;li&gt;Plan Executor&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;存储层&lt;/strong&gt;&lt;/em&gt;：由不同的表引擎组成，这些表引擎封装了表数据的格式和位置&#xA;&lt;ul&gt;&#xA;&lt;li&gt;MergeTree* Family Tables Engines： 代表了 ClickHouse 中的主要持久化格式&lt;/li&gt;&#xA;&lt;li&gt;Special-Purpose Tables Engines：用于加速或分布查询执行的专用表引擎&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Dictionary&lt;/li&gt;&#xA;&lt;li&gt;Memory&lt;/li&gt;&#xA;&lt;li&gt;Distributed (Data Sharding) 处理分布式&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;集成层&lt;/strong&gt;&lt;/em&gt;：用于与外部系统进行双向数据交换的虚拟表引擎，例如关系型数据库 (如 PostgreSQL、MySQL) 、发布/订阅系统 (如 Kafka、RabbitMQ) ，或键值存储 (如 Redis) 。还可以与数据湖 (如 Iceberg) 或对象存储中的文件 (如 AWS S3、Google GCP) 交互&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Virtual Tables Engines&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;正交组件&lt;/strong&gt;&lt;/em&gt;：提供辅助功能&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Thread pools&lt;/li&gt;&#xA;&lt;li&gt;Caches&lt;/li&gt;&#xA;&lt;li&gt;RBAC (Role-Based Access Control)&lt;/li&gt;&#xA;&lt;li&gt;Backups&lt;/li&gt;&#xA;&lt;li&gt;Monitoring&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;&lt;strong&gt;访问层&lt;/strong&gt;&lt;/em&gt;：通过不同协议管理用户会话并与应用程序通信&#xA;&lt;ul&gt;&#xA;&lt;li&gt;User Session&lt;/li&gt;&#xA;&lt;li&gt;Wire protocols&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;我们更进一步，丢掉分布式特性、集成和监控，只保留最影响 OLAP 查询性能的核心设计，如下所示：&lt;/p&gt;</description>
    </item>
    <item>
      <title>ShardingSphere-Proxy问题几则</title>
      <link>https://www.yeqown.xyz/2024/08/18/shardingsphere-proxy%E9%97%AE%E9%A2%98%E5%87%A0%E5%88%99/</link>
      <pubDate>Sun, 18 Aug 2024 09:43:35 +0800</pubDate>
      <guid>https://www.yeqown.xyz/2024/08/18/shardingsphere-proxy%E9%97%AE%E9%A2%98%E5%87%A0%E5%88%99/</guid>
      <description>&lt;p&gt;ShardingSphere Proxy 是 Apache ShardingSphere 的一个子项目，是一个基于 MySQL 协议的数据库中间件，用于实现分库分表、读写分离等功能。在使用过程中，遇到了一些问题，记录如下。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;这里主要针对的是 分库分表 的使用场景。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h3 id=&#34;问题概述&#34;&gt;问题概述&lt;a class=&#34;anchor&#34; href=&#34;#%e9%97%ae%e9%a2%98%e6%a6%82%e8%bf%b0&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;数据库往往是一个系统最容易出现瓶颈的点，当遇到数据库瓶颈时，我们可以通过数据拆分来缓解问题。数据拆分的方式通常分为横向拆分和纵向拆分，横向拆分即分库分表；纵向拆分即把一个库表中的字段拆分到不同的库表中去。这两种手段并不互斥，而是在实际情况中相辅相成。本文即是横向拆分相关内容。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;常见的部署方式有哪些？&lt;/li&gt;&#xA;&lt;li&gt;数据分片规则怎么配置？&lt;/li&gt;&#xA;&lt;li&gt;数据分片数应该怎么确定？&lt;/li&gt;&#xA;&lt;li&gt;数据分片后唯一索引还有用吗？&lt;/li&gt;&#xA;&lt;li&gt;数据分片后数据迁移？&lt;/li&gt;&#xA;&lt;li&gt;数据分片后如何确定实际执行 SQL 语句？&lt;/li&gt;&#xA;&lt;li&gt;数据分片后的查询优化？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;0-常见的部署方式&#34;&gt;0. 常见的部署方式&lt;a class=&#34;anchor&#34; href=&#34;#0-%e5%b8%b8%e8%a7%81%e7%9a%84%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;官方提供了两种部署方式：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;单机部署：将 ShardingSphere Proxy 部署在单台服务器上，用于测试和开发环境。&lt;/li&gt;&#xA;&lt;li&gt;集群部署：将 ShardingSphere Proxy 部署在多台服务器上，用于生产环境。集群模式下使用 zookeeper 来存储元数据。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;关于元数据，元数据是 ShardingSphere Proxy 的核心，用于存储分库分表规则、读写分离规则等信息。&#xA;官方建议使用集群模式部署 生产环境的 ShardingSphere Proxy&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;如果不按照官方的指引，选择部署了多个 Standalone 模式的 ShardingSphere Proxy，那么需要注意“&lt;em&gt;&lt;strong&gt;每个这样的 proxy 节点会有自己的元信息，他们之间并不互通&lt;/strong&gt;&lt;/em&gt;”。在这些情况下会出现节点之间元数据不一致的问题，参看如下测试：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 启动 3 个 standalone 模式的 ShardingSphere Proxy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                          +-------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                          |  LB   |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                          +-------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                              |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                |-------------|--------------|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                |             |              |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            +-------+     +-------+       +-------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            | Node1 |     | Node2 |       | Node3 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            +-------+     +-------+       +-------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;初始表结构如下：&lt;/p&gt;</description>
    </item>
    <item>
      <title>数据库索引基础</title>
      <link>https://www.yeqown.xyz/2018/01/11/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B4%A2%E5%BC%95%E5%9F%BA%E7%A1%80/</link>
      <pubDate>Thu, 11 Jan 2018 19:08:44 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/11/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B4%A2%E5%BC%95%E5%9F%BA%E7%A1%80/</guid>
      <description>&lt;p&gt;数据库索引的简单介绍和使用注意事项&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;树&#34;&gt;树&lt;a class=&#34;anchor&#34; href=&#34;#%e6%a0%91&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;h4 id=&#34;二叉树&#34;&gt;二叉树&lt;a class=&#34;anchor&#34; href=&#34;#%e4%ba%8c%e5%8f%89%e6%a0%91&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;pre&gt;&lt;code&gt;性质1：在二叉树中第 i 层的结点数最多为2^(i-1)（i ≥ 1）&#xA;性质2：高度为k的二叉树其结点总数最多为2^k－1（ k ≥ 1）&#xA;性质3：对任意的非空二叉树 T ，如果叶结点的个数为 n0，而其度为 2 的结点数为 n2，则：n0 = n2 + 1&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;二叉搜索树-bst&#34;&gt;二叉搜索树 BST&lt;a class=&#34;anchor&#34; href=&#34;#%e4%ba%8c%e5%8f%89%e6%90%9c%e7%b4%a2%e6%a0%91-bst&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;pre&gt;&lt;code&gt;若左子树不空，则左子树上所有结点的值均小于它的根结点的值；&#xA;若右子树不空，则右子树上所有结点的值均大于或等于它的根结点的值；&#xA;左、右子树也分别为二叉排序树；&#xA;没有键值相等的节点&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;平衡二叉树-avl树&#34;&gt;平衡二叉树 AVL树&lt;a class=&#34;anchor&#34; href=&#34;#%e5%b9%b3%e8%a1%a1%e4%ba%8c%e5%8f%89%e6%a0%91-avl%e6%a0%91&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;平衡二叉树（balanced binary tree）,又称 AVL 树。它或者是一棵空树,或者是具有如下性质的二叉树：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;它的左子树和右子树都是平衡二叉树，&#xA;左子树和右子树的深度之差的绝对值不超过1。&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进。二叉搜索树有一个缺点就是，树的结构是无法预料的，随意性很大，它只与节点的值和插入的顺序有关系，往往得到的是一个不平衡的二叉树。在最坏的情况下，可能得到的是一个单支二叉树，其高度和节点数相同，相当于一个单链表，对其正常的时间复杂度有O(log(n))变成了O(n)，从而丧失了二叉排序树的一些应该有的优点。&lt;/p&gt;&#xA;&lt;h4 id=&#34;b树&#34;&gt;B树&lt;a class=&#34;anchor&#34; href=&#34;#b%e6%a0%91&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;BTree是平衡搜索多叉树，设树的度为2d（d&amp;gt;1），高度为h，那么BTree要满足以下条件：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;每个叶子结点的高度一样，等于h；&#xA;每个非叶子结点由n-1个key和n个指针point组成，其中d&amp;lt;=n&amp;lt;=2d,key和point相互间隔，结点两端一定是key；&#xA;叶子结点指针都为null；&#xA;非叶子结点的key都是[key,data]二元组，其中key表示作为索引的键，data为键值所在行的数据；&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;b树-1&#34;&gt;B+树&lt;a class=&#34;anchor&#34; href=&#34;#b%e6%a0%91-1&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;B+Tree是BTree的一个变种，设d为树的度数，h为树的高度，B+Tree和BTree的不同主要在于：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;B+Tree中的非叶子结点不存储数据，只存储键值；&#xA;B+Tree的叶子结点没有指针，所有键值都会出现在叶子结点上，且key存储的键值对应data数据的物理地址；&#xA;B+Tree的每个非叶子节点由n个键值key和n个指针point组成；&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3 id=&#34;索引&#34;&gt;索引&lt;a class=&#34;anchor&#34; href=&#34;#%e7%b4%a2%e5%bc%95&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;h4 id=&#34;聚簇索引和非聚簇索引也叫聚集和非聚集&#34;&gt;聚簇索引和非聚簇索引（也叫：聚集和非聚集）&lt;a class=&#34;anchor&#34; href=&#34;#%e8%81%9a%e7%b0%87%e7%b4%a2%e5%bc%95%e5%92%8c%e9%9d%9e%e8%81%9a%e7%b0%87%e7%b4%a2%e5%bc%95%e4%b9%9f%e5%8f%ab%e8%81%9a%e9%9b%86%e5%92%8c%e9%9d%9e%e8%81%9a%e9%9b%86&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;MyISAM 非聚簇索引&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;MyISAM存储引擎采用的是非聚簇索引，非聚簇索引的主索引和辅助索引几乎是一样的，只是主索引不允许重复，不允许空值，他们的叶子结点的key都存储指向键值对应的数据的物理地址。&lt;em&gt;&lt;strong&gt;非聚簇索引的数据表和索引表是分开存储的&lt;/strong&gt;&lt;/em&gt;。非聚簇索引中的数据是根据数据的插入顺序保存。因此非聚簇索引更适合单个数据的查询。插入顺序不受键值影响。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;InnoDB 聚簇索引&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;聚簇索引的主索引的叶子结点存储的是键值对应的数据本身，辅助索引的叶子结点存储的是键值对应的数据的主键键值。因此主键的值长度越小越好，类型越简单越好。&lt;em&gt;&lt;strong&gt;聚簇索引的数据和主键索引存储在一起&lt;/strong&gt;&lt;/em&gt;。聚簇索引的数据是根据主键的顺序保存。因此适合按主键索引的区间查找，可以有更少的磁盘I/O，加快查询速度。&lt;/p&gt;&#xA;&lt;p&gt;但是也是因为这个原因，聚簇索引的插入顺序最好按照主键单调的顺序插入，否则会频繁的引起页分裂，严重影响性能。在InnoDB中，如果只需要查找索引的列，就尽量不要加入其它的列，这样会提高查询效率。&lt;/p&gt;&#xA;&lt;img src=&#34;https://www.yeqown.xyz/images/index_0.jpg&#34;/&gt;&#xA;&lt;h4 id=&#34;索引类型&#34;&gt;索引类型&lt;a class=&#34;anchor&#34; href=&#34;#%e7%b4%a2%e5%bc%95%e7%b1%bb%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;主键索引：根据主键pk_clolum（length）建立索引，不允许重复，不允许空值。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
