欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据库索引

程序员文章站 2022-04-06 13:04:24
01.在创建索引的时候都会考虑哪些因素呢? :对于查询概率比较高,经常作为where条件的字段设置索引。 02.做联合索引多个字段之间顺序你们是如何选择的呢? :识别度最高的字段放到最前面。在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最 ......

01.在创建索引的时候都会考虑哪些因素呢? :对于查询概率比较高,经常作为where条件的字段设置索引。

02.做联合索引多个字段之间顺序你们是如何选择的呢? :识别度最高的字段放到最前面。在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为mysql索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引最    左边开始匹配。所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。

 1.为什么要用索引?当一个表中有上千万条数据,如果按名字一行一行去匹配查找,全表扫描,效率会很慢。这时候就需要用索引,相当于给表加了目标和标题,可以缩小查找范围和加快查找速度。

2.什么是索引? 索引是一种数据结构。一个索引是存储的表中一个特定列的值数据结构(最常见的是b-tree和hash索引)。索引是在表的列上创建。所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。

3.hash索引的优缺点? 优点:哈系索引的工作方式是将列的值作为索引的键值(key),和键值相对应实际的值(value)是指向该表中相应行的指针位置。查新name=“jes”这样的sql效率很快,等值查询的场景更快。

          缺点:1.哈希表是无顺的数据结构,假如你想要找出所有小于40岁的员工 就不能用哈希索引。

             2.哈希索引不支持多列联合索引的最左匹配规则 如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。

4.b-tree索引是怎么提升性能? :假设我们在 employee_name这一列上创建一个b-tree索引。这意味着当我们用之前的sql查找姓名是‘jesus’的雇员时,不需要再扫描全表。而是用索引查找去查找名字为‘jesus’的雇员,因为索引已经按照按字母或者数字顺序排序。索引已经排序意 味着查询一个名字会快很多,因为名字少字母为‘j’的员工都是排列在一起的。另外重要的一点是,索引同时存储了表中相应行的指针以获取其他列的数据。

5.使用数据库索引会有什么代价? :缺点呢?其一,索引会占用空间 - 你的表越大,索引占用的空间越大。其二,性能损失(主要值更新操作),当你在表中添加、删除或者更新行数据的时候, 在索引中也会有相同的操作。记住:建立在某列(或多列)索引需要保存该列 最新的数据。基本原则是只如果表中某列在查询过程中使用的非常频繁,那就在该列上创建索引。

6.b+ tree的叶子节点都可以存哪些东西吗? :innodb的b+ tree可能存储的是整行数据,也有可能是主键的值。

7.整行数据,也有可能是主键的值区别? :在 innodb 里,索引b+ tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引b+ tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引。 聚簇索引查询会更快。因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询。

8.为什么聚簇索引查询会更快? :因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询(通常称为回表)。而且,非主键索引不一定会查询多次,通过覆盖索引也可以只查询一次。 

9.覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。

10.mysql 5.6新加了什么优化?:引入了索引下推优化,默认开启。 2.在people表中(zipcode,lastname,firstname)构成一个索:select * from people where zipcode='95054' and lastname like '%etrunia%' and address like '%main street%';

如果没有使用索引下推技术,则mysql会通过zipcode='95054'从存储引擎中查询对应的数据,返回到mysql服务端,然后mysql服务端基于lastname like '%etrunia%'和address like '%main street%'来判断数据是否符合条件。 如使 用了索引下推技术,则mysql首先会返回符合zipcode='95054'的索引,然后根据lastname like '%etrunia%'和address like '%main street%'来判断索引是否符合条件。如果符合条件,则根据该索引来定位对应的数据,如果不符合,则直接reject掉。 有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。

11.怎么查看索引是否生效? :通过explain查看sql语句的执行计划,通过执行计划来分析索引使用情况。

12.什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢?