mysql索引
使用索引—编写代码时候尽可能利用索引,不过非常小的表除外。因为表小,忽略表中索引能使表的读取更为高效。
什么是索引
数据库中的索引是某个表中一列或多列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
创建索引语法:
create [索引类型] index 索引名称
on 表名(列名)
[with fill factor = 填充因子值0-100]
go
例子:
create index a on table1(id,name);
使用sql:
select * from table1(index = a) where id=1 and name=“你好”;
注意:
select * from table where a = 1 and b=2 and c=3;
如果有索引index(a,b,c),那么where 子句中字段的顺序应和索引中字段顺序一致。
1,索引类型
关系型数据库中最常用的一种索引是二叉树(b-tree)索引。
唯一索引与非唯一索引——唯一索引是指一张表中允许有一个值的索引。慎用唯一索引,因为对唯一索引字段的插入和更新需要扫描整个索引空间。唯一索引提高性能一般用于主键。
复合索引--多字段索引,但是单字段索引比复合字段索引更为高效。
索引数据类型--最好使用整数
mysql中select 查询条件
1,in 与 exists集合运算符--in 运算符用于测试一系列文字值中的某个值
select * from table where id in (1,2,3,4);
Exists用于检查值的动态集合,例如由子查询生成的集合
select * from table where exists (select id from table2);
2,having和where用法
having子句会筛选聚合组合,并在数据库所有i/o活动完成后进行帅选,
使用where的效率更高话,就不要使用having
select id,name,avg(score) from table group by name having id > 5 and avg(score) >10;
将having子句中的id>5限制条件转移到where 子句中修改后如下:
select id,name,avg(score) from table where id>5 group by name having avg(score) > 10;
这样的话效率就执行更高
因为having在id进行帅选的时候不会限制i/o活动,
3,连接
内部连接—内部链接是两个表的交集,交集是最高效的连接类型
select P.name as publisher , E.id from table1 P join table2 E using (id);
脑补下: using 可以简化 on 的语法
table1 inner join table2 on table1.id = table2.id 类似于 table1 inner join table2 using(id)
外部连接--与内部连接相反,返回的是另外一个表所不包含的。
select P.name as publishber , E.id from table1 P left outer join table2 E using(id);
交叉连接--一种笛卡尔乘积,将一个表中的所有记录连接到另一个表中的所有记录。cross join