2)创建索引
① 语法
语法:create 索引类型 索引名 on 表(字段);
建表语句如下:
create table tb( id int(4) auto_increment, name varchar(5), dept varchar(5), primary key(id) ) engine=myISAM auto_increment=1 default charset=utf8;
查询表结构如下:
② 创建索引的第一种方式
Ⅰ 创建单值索引
create index dept_index on tb(dept);
Ⅱ 创建唯一索引:这里我们假定name字段中的值都是唯一的
create unique index name_index on tb(name);
Ⅲ 创建复合索引
create index dept_name_index on tb(dept,name);
③ 创建索引的第二种方式
先删除之前创建的索引以后,再进行这种创建索引方式的测试;
语法:alter table 表名 add 索引类型 索引名(字段)
Ⅰ 创建单值索引
alter table tb add index dept_index(dept);
Ⅱ 创建唯一索引:这里我们假定name字段中的值都是唯一的
alter table tb add unique index name_index(name);
Ⅲ 创建复合索引
alter table tb add index dept_name_index(dept,name);
④ 补充说明
如果某个字段是primary key,那么该字段默认就是主键索引。
主键索引和唯一索引非常相似。相同点:该列中的数据都不能有相同值;不同点:主键索引不能有null值,但是唯一索引可以有null值。
3)索引删除和索引查询
① 索引删除
语法:drop index 索引名 on 表名;
drop index name_index on tb;
② 索引查询
语法:show index from 表名;
show index from tb;
结果如下:
4、SQL性能问题的探索
人为优化:需要我们使用explain分析SQL的执行计划。该执行计划可以模拟SQL优化器执行SQL语句,可以帮助我们了解到自己编写SQL的好坏。
SQL优化器自动优化:最开始讲述MySQL执行原理的时候,我们已经知道MySQL有一个优化器,当你写了一个SQL语句的时候,SQL优化器如果认为你写的SQL语句不够好,就会自动写一个好一些的等价SQL去执行。
SQL优化器自动优化功能【会干扰】我们的人为优化功能。当我们查看了SQL执行计划以后,如果写的不好,我们会去优化自己的SQL。当我们以为自己优化的很好的时候,最终的执行计划,并不是按照我们优化好的SQL语句来执行的,而是有时候将我们优化好的SQL改变了,去执行。
SQL优化是一种概率问题,有时候系统会按照我们优化好的SQL去执行结果(优化器觉得你写的差不多,就不会动你的SQL)。有时候优化器仍然会修改我们优化好的SQL,然后再去执行。
1)查看执行计划
语法:explain + SQL语句
eg:explain select * from tb;
2)“执行计划”中需要知道的几个“关键字”
id :编号
select_type :查询类型
table :表
type :类型
possible_keys :预测用到的索引
key :实际使用的索引
key_len :实际使用索引的长度
ref :表之间的引用
rows :通过索引查询到的数据量
Extra :额外的信息
建表语句和插入数据:
# 建表语句 create table course ( cid int(3), cname varchar(20), tid int(3) ); create table teacher ( tid int(3), tname varchar(20), tcid int(3) ); create table teacherCard ( tcid int(3), tcdesc varchar(200) ); # 插入数据 insert into course values(1,'java',1); insert into course values(2,'html',1); insert into course values(3,'sql',2); insert into course values(4,'web',3); insert into teacher values(1,'tz',1); insert into teacher values(2,'tw',2); insert into teacher values(3,'tl',3); insert into teacherCard values(1,'tzdesc') ; insert into teacherCard values(2,'twdesc') ; insert into teacherCard values(3,'tldesc') ;
5、explain执行计划常用关键字详解
1)id关键字的使用说明
① 案例:查询课程编号为2 或 教师证编号为3 的老师信息:
# 查看执行计划 explain select t.* from teacher t,course c,teacherCard tc where t.tid = c.tid and t.tcid = tc.tcid and (c.cid = 2 or tc.tcid = 3);
结果如下:
接着,在往teacher表中增加几条数据。
insert into teacher values(4,'ta',4); insert into teacher values(5,'tb',5); insert into teacher values(6,'tc',6);
再次查看执行计划。
# 查看执行计划 explain select t.* from teacher t,course c,teacherCard tc where t.tid = c.tid and t.tcid = tc.tcid and (c.cid = 2 or tc.tcid = 3);
结果如下:
表的执行顺序 ,因表数量改变而改变的原因:笛卡尔积。
a b c 2 3 4 最终:2 * 3 * 4 = 6 * 4 = 24 c b a 4 3 2 最终:4 * 3 * 2 = 12 * 2 = 24
分析:最终执行的条数,虽然是一致的。但是中间过程,有一张临时表是6,一张临时表是12,很明显6 < 12,对于内存来说,数据量越小越好,因此优化器肯定会选择第一种执行顺序。
结论:id值相同,从上往下顺序执行。表的执行顺序因表数量的改变而改变。