java面经查缺补漏之二十八天(上一次数据库的索引被问住了,今天再来啃一啃数据库索引)
上一次数据库的索引被问住了,今天再来啃一啃数据库索引
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.高性能的索引策略之选择合适的索引列顺序?