|
29 | 29 | <meta property="og:locale" content="zh_CN"> |
30 | 30 | <meta property="og:image" content="http://simuleite.github.io/ComputerScience/%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/Source/Photo/SQL%20JOIN.jpg"> |
31 | 31 | <meta property="article:published_time" content="2024-07-26T16:00:00.000Z"> |
32 | | -<meta property="article:modified_time" content="2025-02-15T14:07:25.980Z"> |
| 32 | +<meta property="article:modified_time" content="2025-02-20T12:55:09.568Z"> |
33 | 33 | <meta property="article:author" content="SIMULEITE"> |
34 | 34 | <meta property="article:tag" content="基本操作"> |
35 | 35 | <meta name="twitter:card" content="summary"> |
|
143 | 143 | <div class="sidebar-panel-container"> |
144 | 144 | <!--noindex--> |
145 | 145 | <div class="post-toc-wrap sidebar-panel"> |
146 | | - <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%B4%A2%E5%BC%95%E5%8E%9F%E7%90%86"><span class="nav-text"> 索引原理</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%BC%95%E6%93%8E"><span class="nav-text"> 引擎</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E4%B8%BA%E4%BB%80%E4%B9%88innodb%E5%BB%BA%E8%AE%AE%E6%AF%8F%E5%BC%A0%E8%A1%A8%E5%BF%85%E9%A1%BB%E5%BB%BA%E7%AB%8B%E4%B8%BB%E9%94%AE%E5%B9%B6%E7%94%A8%E8%87%AA%E5%A2%9E%E6%95%B4%E5%9E%8B"><span class="nav-text"> 为什么InnoDB建议每张表必须建立主键,并用自增整型?</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#b%E6%A0%91%E5%A6%82%E4%BD%95%E6%94%AF%E6%8C%81%E8%8C%83%E5%9B%B4%E6%9F%A5%E8%AF%A2"><span class="nav-text"> B+树如何支持范围查询</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%81%94%E5%90%88%E4%B8%BB%E9%94%AE%E7%B4%A2%E5%BC%95%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AF%E6%9C%80%E5%B7%A6%E5%89%8D%E7%BC%80%E5%8E%9F%E5%88%99"><span class="nav-text"> 联合主键索引,为什么是最左前缀原则?</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%BA%8B%E5%8A%A1"><span class="nav-text"> 事务</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%8E%9F%E5%AD%90%E6%80%A7-atomicity"><span class="nav-text"> 原子性 Atomicity</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E4%B8%80%E8%87%B4%E6%80%A7-consistency"><span class="nav-text"> 一致性 Consistency</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E9%9A%94%E7%A6%BB%E6%80%A7-isolation"><span class="nav-text"> 隔离性 Isolation</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%8C%81%E4%B9%85%E6%80%A7-durability"><span class="nav-text"> 持久性 Durability</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%BD%BF%E7%94%A8"><span class="nav-text"> 使用</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="nav-text"> 启动数据库</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%99%BB%E5%BD%95%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="nav-text"> 登录数据库</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%AF%BC%E5%85%A5%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="nav-text"> 导入数据库</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="nav-text"> 数据库</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%A1%A8"><span class="nav-text"> 表</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E6%9F%A5%E8%AF%A2"><span class="nav-text"> 查询</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E6%8E%92%E5%BA%8F"><span class="nav-text"> 排序</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%AD%9B%E9%80%89"><span class="nav-text"> 筛选</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E9%80%BB%E8%BE%91%E6%93%8D%E4%BD%9C%E7%AC%A6"><span class="nav-text"> 逻辑操作符</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E6%8F%92%E5%85%A5"><span class="nav-text"> 插入</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E6%9B%B4%E6%96%B0"><span class="nav-text"> 更新</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%88%A0%E9%99%A4"><span class="nav-text"> 删除</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E8%81%94%E7%BB%93"><span class="nav-text"> 联结</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%AE%89%E8%A3%85"><span class="nav-text"> 安装</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%8E%8B%E7%BC%A9%E5%8C%85%E5%AE%89%E8%A3%85"><span class="nav-text"> 压缩包安装</span></a></li></ol></li></ol></div> |
| 146 | + <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%B4%A2%E5%BC%95%E5%8E%9F%E7%90%86"><span class="nav-text"> 索引原理</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%BC%95%E6%93%8E"><span class="nav-text"> 引擎</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E4%B8%BA%E4%BB%80%E4%B9%88innodb%E5%BB%BA%E8%AE%AE%E6%AF%8F%E5%BC%A0%E8%A1%A8%E5%BF%85%E9%A1%BB%E5%BB%BA%E7%AB%8B%E4%B8%BB%E9%94%AE%E5%B9%B6%E7%94%A8%E8%87%AA%E5%A2%9E%E6%95%B4%E5%9E%8B"><span class="nav-text"> 为什么InnoDB建议每张表必须建立主键,并用自增整型?</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#b%E6%A0%91%E5%A6%82%E4%BD%95%E6%94%AF%E6%8C%81%E8%8C%83%E5%9B%B4%E6%9F%A5%E8%AF%A2"><span class="nav-text"> B+树如何支持范围查询</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%81%94%E5%90%88%E4%B8%BB%E9%94%AE%E7%B4%A2%E5%BC%95%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AF%E6%9C%80%E5%B7%A6%E5%89%8D%E7%BC%80%E5%8E%9F%E5%88%99"><span class="nav-text"> 联合主键索引,为什么是最左前缀原则?</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%B4%A2%E5%BC%95%E4%BC%98%E5%8C%96%E5%8E%9F%E5%88%99"><span class="nav-text"> 索引优化原则</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#explain%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90"><span class="nav-text"> explain性能分析</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%AD%97%E6%AE%B5%E8%A7%A3%E9%87%8A"><span class="nav-text"> 字段解释</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#sql%E8%AF%AD%E5%8F%A5%E4%BC%98%E5%8C%96"><span class="nav-text"> sql语句优化</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%BC%93%E5%AD%98"><span class="nav-text"> 缓存</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%BA%8B%E5%8A%A1"><span class="nav-text"> 事务</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%8E%9F%E5%AD%90%E6%80%A7-atomicity"><span class="nav-text"> 原子性 Atomicity</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E4%B8%80%E8%87%B4%E6%80%A7-consistency"><span class="nav-text"> 一致性 Consistency</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E9%9A%94%E7%A6%BB%E6%80%A7-isolation"><span class="nav-text"> 隔离性 Isolation</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%8C%81%E4%B9%85%E6%80%A7-durability"><span class="nav-text"> 持久性 Durability</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E4%BD%BF%E7%94%A8"><span class="nav-text"> 使用</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="nav-text"> 启动数据库</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%99%BB%E5%BD%95%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="nav-text"> 登录数据库</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%AF%BC%E5%85%A5%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="nav-text"> 导入数据库</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="nav-text"> 数据库</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%A1%A8"><span class="nav-text"> 表</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E6%9F%A5%E8%AF%A2"><span class="nav-text"> 查询</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E6%8E%92%E5%BA%8F"><span class="nav-text"> 排序</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%AD%9B%E9%80%89"><span class="nav-text"> 筛选</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E9%80%BB%E8%BE%91%E6%93%8D%E4%BD%9C%E7%AC%A6"><span class="nav-text"> 逻辑操作符</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E6%8F%92%E5%85%A5"><span class="nav-text"> 插入</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E6%9B%B4%E6%96%B0"><span class="nav-text"> 更新</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%88%A0%E9%99%A4"><span class="nav-text"> 删除</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E8%81%94%E7%BB%93"><span class="nav-text"> 联结</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%AE%89%E8%A3%85"><span class="nav-text"> 安装</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%8E%8B%E7%BC%A9%E5%8C%85%E5%AE%89%E8%A3%85"><span class="nav-text"> 压缩包安装</span></a></li></ol></li></ol></div> |
147 | 147 | </div> |
148 | 148 | <!--/noindex--> |
149 | 149 |
|
@@ -225,7 +225,7 @@ <h1 class="post-title" itemprop="name headline"> |
225 | 225 | <i class="far fa-calendar-check"></i> |
226 | 226 | </span> |
227 | 227 | <span class="post-meta-item-text">更新于</span> |
228 | | - <time title="修改时间:2025-02-15 22:07:25" itemprop="dateModified" datetime="2025-02-15T22:07:25+08:00">2025-02-15</time> |
| 228 | + <time title="修改时间:2025-02-20 20:55:09" itemprop="dateModified" datetime="2025-02-20T20:55:09+08:00">2025-02-20</time> |
229 | 229 | </span> |
230 | 230 |
|
231 | 231 |
|
@@ -256,6 +256,49 @@ <h2 id="联合主键索引为什么是最左前缀原则"><a class="markdownIt-A |
256 | 256 | <p>最左前缀原则:不能跳过左边的索引,必须从最左边索引开始,逐步增加条件。<br /> |
257 | 257 | 因为联合主键索引底层的B+树就是按照主键顺序排序的,会从左到右进行比较;如果跳过了左边的主键,那就找不到了,因为第二个主键不一定是排好序的!。<br /> |
258 | 258 | 首先按照第一个主键排序,然后按照第二个主键排序。在同一个主键内,二级主键是有序的,但是跳出这个圈,就是无序的。</p> |
| 259 | +<h1 id="索引优化原则"><a class="markdownIt-Anchor" href="#索引优化原则"></a> 索引优化原则</h1> |
| 260 | +<h2 id="explain性能分析"><a class="markdownIt-Anchor" href="#explain性能分析"></a> explain性能分析</h2> |
| 261 | +<p><code>explain extended</code>: <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>r</mi><mi>o</mi><mi>w</mi><mi>s</mi><mo>∗</mo><mi>f</mi><mi>i</mi><mi>l</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>e</mi><mi>d</mi><mi mathvariant="normal">/</mi><mn>100</mn></mrow><annotation encoding="application/x-tex">rows * filtered/100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.46528em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">t</span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">d</span><span class="mord">/</span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>可以估算出将要和explain中前一个表达式进行连接的行数。<br /> |
| 262 | +<code>show warning</code>: Mysql的提示信息,可能会帮你优化。</p> |
| 263 | +<h3 id="字段解释"><a class="markdownIt-Anchor" href="#字段解释"></a> 字段解释</h3> |
| 264 | +<p>select_type</p> |
| 265 | +<ul> |
| 266 | +<li>Primary 最外层的select。</li> |
| 267 | +<li>Subquery 不在from语句中,包含在select中的子查询。</li> |
| 268 | +<li>Derived 包含在from语句中的子查询。派生表。<br /> |
| 269 | +id</li> |
| 270 | +<li>表示执行顺序,顺序越靠后优先级越高<br /> |
| 271 | +<strong>type</strong><br /> |
| 272 | +效率优先级 system > const > eq_ref > ref > range > index > ALL</li> |
| 273 | +</ul> |
| 274 | +<blockquote> |
| 275 | +<p>一般来说range是及格线,最好达到ref</p> |
| 276 | +</blockquote> |
| 277 | +<ul> |
| 278 | +<li>NULL mysql通过优化和底层原理,不访问表或索引就取到值。如求最小值,通过B+树直接拿到。</li> |
| 279 | +<li>system, const system是const的特例,const表示常量查询。表只有一行,为const查询。只有一条元组匹配,为system查询。</li> |
| 280 | +<li>eq_ref 主键关联查询,表有几行。</li> |
| 281 | +<li>ref 使用非主键(不唯一)索引,表有很多行。使用普通索引或唯一索引的部分前缀。</li> |
| 282 | +<li>range 范围查找,包括比较符号。</li> |
| 283 | +<li>index 无查询条件,全选。扫描全索引就能拿到结果,一般扫描二级索引(Mysql优先选择同等条件下更小的索引)。</li> |
| 284 | +<li>ALL 全表扫描。扫描聚集索引,比index更大</li> |
| 285 | +</ul> |
| 286 | +<h2 id="sql语句优化"><a class="markdownIt-Anchor" href="#sql语句优化"></a> sql语句优化</h2> |
| 287 | +<ul> |
| 288 | +<li>尽量使用覆盖索引</li> |
| 289 | +</ul> |
| 290 | +<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 推荐,其中name和age都有索引</span></span><br><span class="line"><span class="keyword">select</span> name, age <span class="keyword">from</span> your_table <span class="keyword">where</span> <span class="keyword">condition</span></span><br><span class="line"><span class="comment">-- 不推荐</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> your_table <span class="keyword">where</span> <span class="keyword">condition</span></span><br></pre></td></tr></table></figure> |
| 291 | +<ul> |
| 292 | +<li>少用or或in;不对索引用函数;不让索引发生隐式转换</li> |
| 293 | +<li>减少搜索范围;范围过大,mysql会认为全表扫描更快,从而不走索引</li> |
| 294 | +<li><code>force index(your_index)</code> 强制索引(注意,不一定更快!可能更多回表)</li> |
| 295 | +<li>试试用<code>like</code>代替范围查询</li> |
| 296 | +</ul> |
| 297 | +<h1 id="缓存"><a class="markdownIt-Anchor" href="#缓存"></a> 缓存</h1> |
| 298 | +<p>Mysql8以后移除了缓存。</p> |
| 299 | +<blockquote> |
| 300 | +<p>Mysql缓存的本质是KV Map。然而,对于高频修改的数据,Map缓存下来的是<strong>脏数据</strong>,因此不实用。</p> |
| 301 | +</blockquote> |
259 | 302 | <h1 id="事务"><a class="markdownIt-Anchor" href="#事务"></a> 事务</h1> |
260 | 303 | <h2 id="原子性-atomicity"><a class="markdownIt-Anchor" href="#原子性-atomicity"></a> 原子性 Atomicity</h2> |
261 | 304 | <figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">BUSINESS</span><br><span class="line"><span class="keyword">sql</span>语句<span class="number">1</span></span><br><span class="line"><span class="keyword">sql</span>语句<span class="number">2</span></span><br><span class="line"><span class="keyword">COMMIT</span></span><br></pre></td></tr></table></figure> |
|
0 commit comments