SQL执行加载顺序
(1)人写
- select
- distinct
- from
- join
- on
- where
- group by
- having
- order by
-
(2)机读
from
- on
- join
- where
- group by
- having
- select
- distinct
- order by
- limit
七种JOIN理论
1:
SELECT * FROM tbl_dept a INNER JOIN tbl_emp b ON a.id = b.deptId;
2:
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id = b.deptId;
3:
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId;
4:
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id = b.deptId WHERE b.id IS NULL;
5:
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId WHERE a.id IS NULL;
6:
```sql SELECT * FROM tbl_dept a FULL OUTER JOIN tbl_emp b ON a.id = b.deptId;# 注意:MySQL不支持此语法
迂回的方法
SELECT FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id = b.deptId UNION # UNION 合并并去重 SELECT FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId;
<a name="yoygK"></a>### 7:```sqlSELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id = b.deptId WHERE b.id IS NULLUNIONSELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId WHERE a.id IS NULL;
1:哪些条件需要创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系建立索引
- 频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引。
- where条件里用不到的字段不创建索引
- 单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
-
2:哪些条件不适合建立索引
表记录太少(mysql一般三百万以上才去建立索引)
- 经常增删改的表
- 数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引。
注意:如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果
一:索引概述
MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序),数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引:即排好序的快速查询数据结构。二:索引优势劣势
优势
类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
劣势
实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引也是要占用空间的。
虽然索引大大提高了查询效率,同时却也降低了更新表的速度。如对表进行增删改。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
三:索引结构
索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的,所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。MySQL目前提供了以下四种索引:
BTREE索引:最常见的索引类型,大部分索引都支持B树索引。
- HASH索引:只有Memory引擎支持,使用场景简单
- R-tree索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间的数据类型,通常使用较少,不做特别介绍。
- Full-text(全文索引):全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从MySQL5.6版本开始支持全文索引。
我们平常所说的索引,如果没有特别指明,都是指B+树(多路搜索树,并不一定是二叉的)结构组织的索引,其中聚集索引,符合索引,前缀索引,唯一索引默认都是使用B-tree树索引,统称为索引。
四:BTREE索引
(1)BTREE结构
BTREE又叫多路平衡搜索树,一颗m叉的BTREE特性如下:
- 树中每个节点最多包含m个孩子。
- 除根节点与叶子节点外,每个节点至少有【ceil(m/2)】个孩子
- 若根节点不是叶子节点,则至少有两个孩子
- 所有的叶子节点都在同一层
- 每个非叶子节点由n个key与n+1个指针组成,其中【ceil(m/2)-1】<=n<=m-1
BTREE树和二叉树相比,查询数据的效率更高,因为对于相同的数据量来说,BTREE的层级结构比二叉树小,因此搜索速度会更快。
(2)B+TREE结构
B+Tree为BTREE的变种,B+TREE与BTREE的区别为:
- n叉B+TREE最多含有n个key,而BTREE最多含有n-1个key。
- B+TREE的叶子节点保存所有的key信息,依key大小顺序排列。
- 所有的非叶子节点都可以看做是key的索引部分。
由于B+TREE只有叶子节点保存key信息,查询任何key都要从root走到叶子,所以B+TREE的查询效率更加稳定。
(3)MySQL中的B+TREE
MYSQL索引数据结构对经典的B+TREE进行了优化,在原B+TREE的基础上,增加一个指向相邻叶子节点的链表指针,就形成了 带有顺序指针的B+TREE,提高区间访问(即范围搜索)的性能。
五:索引分类
- 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引
- 唯一索引:索引列的值必须唯一,但允许有空值(运行包含多个空值)
- 复合索引:即一个索引包含多个列
六:索引语法
索引在创建表的时候,可以同时创建,也可以随时增加新的索引。(1)创建索引
CREATE 【UNIQUE|FULLTEXT|SPATIAL】 INDEX index_name #index_name代表索引名称 【USING index_type】 #【USING index_type】指定索引用哪个类型,不指定则默认为BTREE类型 ON tbl_name(index_col_name...) # 在mysql当中,如果一个键为主键,则他默认就有主键索引 # 例如: CREATE INDEX idx_city_name ON city(city_name);(2)查看索引
show index from table_name;(3)删除索引
drop index index_name on table_name;(4)ALTER命令
```sql alter table ta_name add primary key(column_list);该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
alter table tb_name add unique index_name(column_list);
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)
alter table tb_name add index index_name(column_list);
添加普通索引,索引值可以出现多次
alter table tb_name add fulltext index_name(column_list);
该语句指定了索引为FULLTEXT,用于全文索引
<a name="s6PV4"></a>
# 七:索引设计原则
索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于提升索引的使用效率,更高效的使用索引。
1. 对查询频次较高,且数据量比较大的表建立索引
1. 索引字段的选择,最佳候选列应当从where字句的条件中提取,如果where字句中的组合较多,那么应当挑选最常用、过滤效果最好的列组合。
1. 使用唯一索引,区分度越高,使用索引的频率越高。
1. 索引可以有效的提升查询数据的效率,但索引数量不是多多益善,索引越多 ,维护索引的代价自然也就水涨船高。对于插入、更新、删除等DML操作比较频繁的表来说,索引过多,会引入相当高的维护代价,降低DML操作的效率,增加相应操作的时间消耗。另外索引过多的话,MYSQL也会犯选择困难症,虽然最终仍然会找到一个可用的索引,但无疑提高了选择的代价。
1. 使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的I/O效率,也可以提升总体的访问效率,假如构成索引的字段总长度比较短,那么在给定大小的存储块内可以存储更多的索引值,相应的可以有效的提升MYSQL访问索引的I/O效率。
1. 利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引,如果查询时对where字句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合索引来提升查询效率。
```sql
# 创建组合索引
create index idx_name_email_status on tb_seller(NAME,email,STATUS);
# 就相当于
#对name创建索引
#对name,email创建了索引
#对name,email,status创建了索引
