Mysql文字笔记
<h1>1.索引</h1>
<ul>
<li>
<p>Hash索引:</p>
<ul>
<li>每条记录的hash码具有随机性,逻辑上连续的数据在物理上不具有存储连续性</li>
<li>适合于精确查询,不适用于范围查询</li>
<li>如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题</li>
</ul>
</li>
<li>B+树索引:
<ul>
<li>相对于B树而言,B+树由于每个节点只存储索引,所以可以存储更多索引,磁盘I/O次数更少</li>
<li>如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题</li>
<li>B+ 所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定</li>
<li>B+ 树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像 B 树一样需要对每一层进行遍历,这有利于数据库做全表扫描</li>
</ul></li>
<li>
<p>聚簇索引:</p>
<ul>
<li>索引顺序与数据物理存储顺序一致</li>
<li>叶子结点是数据节点</li>
<li>一张表只允许存在一个聚簇索引</li>
</ul>
</li>
<li>
<p>联合索引:遵循最左前缀匹配原则</p>
<ul>
<li>假设学生表t_student有联合索引(classId,name,age)</li>
<li><code>SELECT * FROM t_student WHERE age=1</code>不会用到索引</li>
<li><code>SELECT * FROM t_student WHERE classId > 1 AND classId < 4 and name > a AND name < x</code>只要联合索引的最左侧列有效,其他的都无法使用到索引</li>
<li><code>SELECT * FROM student WHERE classId = 1 AND name > a AND name < x</code> calssId 是走索引的,其次 name 也是走索引的</li>
</ul>
</li>
<li>回表:根据非主键索引查询到的结果并没有查找的字段值,此时就需要再次根据主键从聚簇索引的根节点开始查找,这样再次查找到的记录才是完成的。</li>
</ul>