CREATE TABLE tbl_dept( id INT(11) NOT NULL AUTO_INCREMENT, deptName VARCHAR(30) DEFAULT NULL, locAdd VARCHAR(40) DEFAULT NULL, PRIMARY KEY(id) )ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; CREATE TABLE tbl_emp ( id INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(20) DEFAULT NULL, deptId INT(11) DEFAULT NULL, PRIMARY KEY (id), KEY fk_dept_Id (deptId) #CONSTRAINT 'fk_dept_Id' foreign key ('deptId') references 'tbl_dept'('Id') )ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11); INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12); INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13); INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14); INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15); INSERT INTO tbl_emp(NAME,deptId) VALUES('z3',1); INSERT INTO tbl_emp(NAME,deptId) VALUES('z4',1); INSERT INTO tbl_emp(NAME,deptId) VALUES('z5',1); INSERT INTO tbl_emp(NAME,deptId) VALUES('w5',2); INSERT INTO tbl_emp(NAME,deptId) VALUES('w6',2); INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3); INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4); INSERT INTO tbl_emp(NAME,deptId) VALUES('s9',51);
#左链接 SELECT * FROM tbl_dept t1 LEFT JOIN tbl_emp t2 on t1.id = t2.deptId; #右链接 SELECT * FROM tbl_dept t1 RIGHT JOIN tbl_emp t2 on t1.id = t2.deptId; #内链接(交集) SELECT * FROM tbl_dept t1 INNER JOIN tbl_emp t2 on t1.id = t2.deptId; #左链接(只取A独有的) SELECT * FROM tbl_dept t1 LEFT JOIN tbl_emp t2 on t1.id = t2.deptId WHERE t2.deptId is NULL; #右链接(只取B独有的) SELECT * FROM tbl_dept t1 RIGHT JOIN tbl_emp t2 on t1.id = t2.deptId WHERE t1.id is NULL; #A和B均有 SELECT * FROM tbl_dept t1 LEFT JOIN tbl_emp t2 on t1.id = t2.deptId UNION SELECT * FROM tbl_dept t1 RIGHT JOIN tbl_emp t2 on t1.id = t2.deptId; #A和B均是独有 SELECT * FROM tbl_dept t1 LEFT JOIN tbl_emp t2 on t1.id = t2.deptId WHERE t2.deptId is NULL UNION SELECT * FROM tbl_dept t1 RIGHT JOIN tbl_emp t2 on t1.id = t2.deptId WHERE t1.id is NULL;
CREATE [UNIQUE] INDEX index_name ON mytable(column_name(length));
DROP INDEX index_name ON mytable;
\G
表示将查询到的横向表格纵向输出,方便阅读)SHOW INDEX FROM table_name\G
#该语句添加一个主键,这意味着索引值必须是惟一的,且不能为NULL。 ALTER TABLE tbl_name ADD PRIMARY KEY(column_list) #这条语句建立索引的值必须是惟一的(除了NULL外,NULL可能会出现屡次) ALTER TABLE tbl_name ADD UNIQUE index_name(column_list) #添加普通索引,索引值可出现屡次。 ALTER TABLE tbl_name ADD INDEX index_name(column_list) #该语句指定了索引为FULLTEXT,用于全文索引。 ALTER TABLE tbl_name ADD FULLTEXT index_name(column_list)
详情可查看:多路查找树(B-Tree,B+Tree,B*Tree)html
B-树的关键字(数据项)和记录是放在一块儿的; B+树的非叶子节点中只有关键字和指向下一个节点的索引, 记录只放在叶子节点中。mysql
select_type:查询的类型,主要用于区别普通查询、联合查询、子查询等复杂查询算法
table:显示这一行的数据是关于哪张表的sql
type:访问类型排列,显示查询使用了何种类型,其中从好到坏依次是:system>const>eq_ref>ref>fultext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL。其中,相比比较重要的指标为:system > const > eq_ref > ref > range > index > ALL数据库
根据表统计信息及索引选用状况,大体估算出找到所需的记录所须要读取的行数缓存
表示相应的select操做中使用了覆盖索引(Coveing Index),避免访问了表的数据行。服务器
若是同时出现using where,代表索引被用来执行索引键值的查找数据结构
若是没有同时出现using where,代表索引用来读取数据而非执行查找动做 并发
覆盖索引:
理解方式一:就是select的数据列只用从索引中就可以取得,没必要读取数据行,MySQL能够利用索引返回select列表中的字段,而没必要根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。
理解方式二:索引是高效找到行的一个方法,可是通常数据库也能使用索引找到一个列的数据,所以它没必要读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能经过读取索引就能够获得想要的数据,那就不须要读取行了。一个索引包含了(或覆盖了)知足查询结果的数据就叫作覆盖索引。
注意:若是要使用覆盖索引,必定要注意select列表中只取出须要的列,不可select * ,由于若是将全部字段一块儿作索引会致使索引文件过大,查询性能降低。
表示使用了where过滤ide
表示使用了链接缓存
where子句的值老是false,不能用来获取任何元组
在没有GROUP BY子句的状况下,基于索引优化MIN/MAX操做或者对于MyISAM存储引擎优化COUNT(*)
操做,没必要等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
优化distinct,在找到第一匹配的元组后即中止找一样值的工做