看了很多材料 希望有个能快速理解啊索引意义
使用索引的全部意义就是通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。
- 大大减轻了服务器需要扫描的数据量,从而提高了数据的检索速度
- 帮助服务器避免排序和临时表
- 可以将随机I/O变为顺序I/O
索引是一种数据结构 。
原理:
2.1 为什么我们添加完索引后查询速度为变快?
传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,mysql需要将表的数据从头到尾遍历一遍
在我们添加完索引之后,mysql一般通过BTREE算法生成一个索引文件,在查询数据库时,找到索引文件进行遍历(折半查找大幅查询效率),找到相应的键从而获取数据
2.2 索引的代价
1. 创建索引是为产生索引文件的,占用磁盘空间
2. 索引文件是一个二叉树类型的文件,可想而知我们的dml操作同样也会对索引文件进行修改,所以性能会下降
2.3 在哪些column上使用索引?
1 .较频繁的作为查询条件字段应该创建索引
2. 唯一性太差的字段不适合创建索引,尽管频繁作为查询条件,例如gender性别字段
3. 更新非常频繁的字段不适合作为索引
4.不会出现在where子句中的字段不该创建索引
总结: 满足以下条件的字段,才应该创建索引.
a: 肯定在where条经常使用 b: 该字段的内容不是唯一的几个值 c: 字段内容不是频繁变化使用方法:
假如你有一个表,
SQL> CREATE TABLE test_tab (
id INT,最常见的俩种索引
name VARCHAR(10),
age INT,
val VARCHAR(10)6 );你的业务,有一个查询,是
SELECT * FROM test_tab WHERE name = 一个外部输入的数据
刚开始,数据不多的时候,执行效果还不错。
随着数据量的增加,这个查询,执行起来,越来越慢了。
然后在 name 上面 建立了索引
CREATE INDEX idx_test4_name ON test_tab (name );
这样, 可以加快前面那个查询的速度。
但是,某天,你执行了下面这个SQL, 发现速度又慢了
SELECT * FROM test_tab WHERE age = 25
为啥呢? 因为 age 字段上面,没有索引
索引只在 name 上面有
换句话说, 也就是 WHERE 里面的条件, 会自动判断,有没有 可用的索引,如果有, 该不该用。
多列索引,就是一个索引,包含了2个字段。
例如:CREATE INDEX idx_test_name_age ON test_tab (name, age);那么SELECT * FROM test_tabWHEREname LIKE '张%'
AND age = 25
这样的查询,将能够使用上面的索引。
多列索引,还有一个可用的情况就是, 某些情况下,可能查询,只访问索引就足够了, 不需要再访问表了。例如:SELECTAVG( avg ) AS 平均年龄FROMtest_tabWHEREname LIKE '张%'
这个时候, name 与 age 都包含在索引里面。 查询不需要去检索表中的数据。
普通索引
普通索引一般是在建表后再添加的,
create index 索引名 on table_name(column1,column2);alter table table_name add index 索引名(column1,column2);