mysql 何时用单列索引?什么使用用联合索引?(收集)

我一个表 students 表,有3个字段 ,id,name,age 我要查询 经过 name 和age,在这两个字段 是建立 联合索引?仍是分别在name和age上建立 单列索引呢? 多个字段查询什么状况下用联合索引 何时分别建立单列索引呢?mysql


1,首先要肯定优化的目标,在什么样的业务场景下,表的大小等等。若是表比较小的话,可能都不须要加索引。
2,哪些字段能够建索引,通常都where、order by 或者 group by 后面的字段。
3,记录修改的时候须要维护索引,因此会有开销,要衡量建了索引以后的得与失。 sql

学生表,能够认为name的重复度比较小,而age的重复度比较大,对于单列索引来讲,比较适合建在重读度低的列上。 优化

对于select * from students where name='张三’and age=18; 题主所说的两种状况
A. name 和 age 各自单独创建索引。
通常来讲mysql会选择其中一个索引,name的可能性比较大,由于mysq会统计每一个索引上的重复度,选用低重复度的字段。另一个age的索引就不会用到,但还有维护索引的开销,因此age的索引不须要建立。 spa

B. name和age的联合索引
这种索引的切合度最好,mysql会直接选用这个索引。但相对单独的name索引来讲,维护的成本要大一些,而且索引数据占用的存储空间也要更大一些。 排序

回过来看,有必要使用联合索引吗? 个人见解是没有必要,由于学校里可能会有重名的人,但比较少。用name就能够比较精准的找到记录,即便有重复的也比较少。 索引

什么状况下使用联合索引比较好呢? 举一个例子,大学选认课老师,须要建立一个关系对应表,有2个字段,student_id 和 teacher_id,想要查询某个老师和某个学生是否存在师生关系。
一个学生会选几十个老师,一个老师会带几百个学生
若是只为student_id创建索引的状况下,通过索引会选出几十条记录,而后在内存中where一下,去除其他的老师。
相反若是只为teacher_id创建索引,通过索引会选出几百条记录,而后在内存中where一下,去除其他的学生。
两种状况都不是最优的,这个时候使用联合索引最合适,经过索引直接找到对应记录。
 
建立索引实例:

首先建立一个表:create table students (id int primary key,name varchar(20),age Int);内存

建立单个索引的语法:create index 索引名 on 表名(字段名)table

索引名通常是:表名_字段名class

给id建立索引:create index students _id on students (id);test

建立联合索引的语法:create index 索引名 on 表名(字段名1,字段名2) 

给name和age建立联合索引:create index students _name_age on students (name,age)

 

 

MySQL_MySQL 联合索引详解 以及注意事项

联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询能够只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 能够支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。


两个或更多个列上的索引被称做复合索引。
利用索引中的附加列,您能够缩小搜索的范围,但使用一个具备两列的索引 不一样于使用两个单独的索引。复合索引的结构与电话簿相似,人名由姓和名构成,电话簿首先按姓氏对进行排序,而后按名字对有相同姓氏的人进行排序。若是您知 道姓,电话簿将很是有用;若是您知道姓和名,电话簿则更为有用,但若是您只知道名不姓,电话簿将没有用处。
因此说建立复合索引时,应该仔细考虑列的顺序。对索引中的全部列执行搜索或仅对前几列执行搜索时,复合索引很是有用;仅对后面的任意列执行搜索时,复合索引则没有用处。
如:创建 姓名、年龄、性别的复合索引。

create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);

优: select * from test where a=10 and b>50
差: select * from test where a50

优: select * from test order by a
差: select * from test order by b
差: select * from test order by c

优: select * from test where a=10 order by a
优: select * from test where a=10 order by b
差: select * from test where a=10 order by c

优: select * from test where a>10 order by a
差: select * from test where a>10 order by b
差: select * from test where a>10 order by c

优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b=10 order by b
优: select * from test where a=10 and b=10 order by c

优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b>10 order by b
差: select * from test where a=10 and b>10 order by c



mysql 复合索引,联合索引 - flyflying1987 - ly

 
索引原则
1.索引越少越好缘由:主要在修改数据时,第个索引都要进行更新,下降写速度。2.最窄的字段放在键的左边3.避免file sort排序,临时表和表扫描.

相关文章
相关标签/搜索