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

java面经查缺补漏之二十八天(上一次数据库的索引被问住了,今天再来啃一啃数据库索引)

程序员文章站 2022-05-12 16:35:03
...

上一次数据库的索引被问住了,今天再来啃一啃数据库索引

1.数据库索引的优点?

(1)减少了服务器需要扫描的数据量。

(2)可以帮助服务器避免排序,因为它已经排序好了。

(3)叶子节点包含所有信息,是一个链表,支持范围查找。

(4)将随机IO变成了顺序IO。

2.高性能的索引策略之独立的列?

索引列不能是表达式的一部分。

例子:SELECT actor_id from actor WHERE actor_id+1=5。

虽然右边的计算很简单,但是很不优化。要始终将索引列单独放在等号的一端。

3. 高性能的索引策略之前缀索引?

其实前缀索引很好理解,有时候需要很长的字符列,这会使得索引大且慢,所以,我们可以索引开始的部分字符,从而提升索引效率,但这样会降低索引的选择性。

所以,我们需要正确选择索引的长度,太短,索引选择性降低,太长,效率太低。

前缀索引长度计算方式:计算不同长度的索引选择性的值。

4.高性能的索引策略之多列索引?

多列索引的创建表和单列索引的创建表如下图所示

当查询语句的条件中包含last_name 和 first_name时

SELECT * FROM test WHERE last_name='Kun' AND first_name='Li';

sql会先过滤出last_name符合条件的记录,在其基础上在过滤first_name符合条件的记录。

那如果我们分别在last_name和first_name上创建两个列索引,mysql的处理方式就不一样了,它会选择一个最严格的索引来进行检索,可以理解为检索能力最强的那个索引来检索,另外一个利用不上了,这样效果就不如多列索引了。

多列建索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。

另外建立多列索引时,顺序也是需要注意的,应该将严格的索引放在前面,这样筛选的力度会更大,效率更高。

语句后面有and用多列索引好一些,如果是or的话那就不行了。

多列索引:

CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
);

单列索引:

CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name),
     INDEX_2 name (first_name)
);

5.高性能的索引策略之选择合适的索引列顺序?

java面经查缺补漏之二十八天(上一次数据库的索引被问住了,今天再来啃一啃数据库索引)