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,在找到第一匹配的元組後即中止找一樣值的工做