1.首先明确索引,的作用,索引的作用是优化查询,让查询更加快速。
索引在mysql中也叫作key,是存储引擎中的一种数据结构。
索引优化应该是对查询性能优化最有效的手段了。
索引基础:
比如说一本书啊,我通过目录可以快速定位到自己要查询页码,mysql中的索引,也是类似于一本书的目录,索引里面存储的数据的位置。
例如
这个语句是从sakila.actor表中查询actor_id为5的名称,
如果我们在actor_id上建立了索引,则mysql则使用该索引找到actor-id为5的行,也就是说mysql现在索引上按值进行查找,然后返回所有包含该值得数据。
索引可以是单个列的值,也可以是多列组合创建索引。那么列的顺序也很重要,因为mysql只能高效的使用索引最左前缀列
-索引的类型
B-Tree索引:
如果没有指定索引类型多半说的都是b-tree索引,主键 auto_increment 自增索引。
B+tree 每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历,
B-tree 索引子所以能够加快访问数据库的速度,因为存储引擎不需要对数据库进行全盘扫描获取需要的数据,取而代之的是从索引的根节点开始进行搜索,
B-tree原则:
如果不是按照索引的最左列开始查找,则无法使用索引,例如上面的例子,索引无法查找名字为bill的人,因为这个不是索引最左前缀的列,
Hash索引:
hash索引就是数据存储的时候,把索引的字段按照hash值得顺序存储,然后查询的时候,把条件转为hash值,去hash表中去匹配,存入的数据和展示的数据并不是顺序一致的。
先根据hash值,找到位置,然后比较值是否相等,如果不相等则表示没找到。
hash索引只包含hash值和行指针,并不是存储字段值, hash表不是按照顺序存储的所以也无法排序
hash所以只支持值判断,不支持范围匹配
空间数据索引 R-tree 了解:
全文索引:文本中的关键字作为索引
-索引的优点
1.索引可以让服务器快速的定位到表的位置,但这并不是索引的唯一作用,
B-tree索引 数据库可以 group by 和 order by 因为数据是有序的。
索引大大减少了服务器需要扫描的数据量,那么耗时也就少了
索引可以帮助服务器避免排序和临时表
索引可以将随机io转变为顺序id
索引并不是最好的工具,总的来说,只有当索引帮助存储殷勤快速查找到记录好处大于其带来的额外工作时,索引才是有效的。
对于非常小的表,大部分情况下,全盘扫描的效率会更高,对于中到大型表,索引就非常有效了
特大的表也不适合做索引,建立索引使用索引代价很高,无论是开发时间还是运行效率都不显著,这时候需要考虑到分表的计数。
分表就是告诉数据库查什么类型的数据,我是存储在哪一张表的元数据。