MySql的存儲(chǔ)引擎介紹 :
常用的MySql存儲(chǔ)引擎只有兩個(gè):MyISAM以及InnoDB。
兩個(gè)存儲(chǔ)引擎的區(qū)別:
索引優(yōu)化分析:
使用Mysql可能遇到的問題:性能下降驳庭,Sql慢了,執(zhí)行的時(shí)間很長嫂沉,等待的時(shí)間很長抖拴。
那么就可能是第一種我們的sql查詢寫的很爛意述,第二種索引已經(jīng)失效了喘落,第三種關(guān)聯(lián)的查詢太多的join以及第四種服務(wù)器調(diào)優(yōu)各個(gè)參數(shù)的設(shè)置過小等導(dǎo)致懈叹。
第一種:sql查詢寫的可能很爛,各種連接各種子查詢導(dǎo)致用不上索引或者是沒建索引而導(dǎo)致Sql跑的賊慢
第二種:索引失效缤削,可能是建了索引沒有用上窘哈,也可能是沒有建過索引而導(dǎo)致。
索引有兩種:一種叫單值索引亭敢,一種叫復(fù)合索引滚婉。
????????????????? 單值索引:只在一個(gè)表中的一個(gè)字段建索引。
????????????????也即:create index idx_user_name on user(name);
????????????????復(fù)合索引:在一個(gè)表中的多個(gè)字段建索引帅刀。
????????????????也即:create index idx_user_name_age on user(name,age);
第三種: 在傳統(tǒng)企業(yè)中让腹,可能出現(xiàn)十幾張表各種join,較為復(fù)雜扣溺,也可能導(dǎo)致性能下降骇窍,Sql變慢的現(xiàn)象。
第四種:服務(wù)器的參數(shù)設(shè)置的不合理娇妓,不恰當(dāng)也可能導(dǎo)致性能下降像鸡,Sql變慢的現(xiàn)象。
常用的Join查詢:
Join最常見的就是內(nèi)連接哈恰,左連接,外連接志群,交叉連接着绷,笛卡爾積以及全連接。
最全的Join圖:
上圖全解釋:
1.內(nèi)連接:這兩張表中間只有共有的部分锌云。
2.左全連接:兩張表LEFT JOIN荠医,A表的全部,A和B的共有加上A的獨(dú)有。
3.右全連接:兩張表RIGHT JOIN彬向,B表的全部兼贡,A和B的共有加上B的獨(dú)有。
4.左連接:兩張表LEFT JOIN娃胆,A表中只占它自己的部分遍希,不與B表進(jìn)行共享,那么B就是NULL里烦。
5.右連接:兩張表RIGHT JOIN凿蒜,B表中只占它自己的部分,不與A表進(jìn)行共享胁黑,那么A就是NULL废封。
6.全連接:兩張表FULL JOIN 全連接。
7.左右連接:兩張表沒有共有部分丧蘸,左右獨(dú)立連接漂洋。
7種Join Sql案例編寫:
1.建表測試:
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);
2.查看部門表以及員工表:
3.Join圖對(duì)應(yīng)的Sql案例:
1).根據(jù)下圖的“內(nèi)連接” 的意思,在員工表以及部門表中寫出相應(yīng)的sql語句力喷,也即:
得出最終的結(jié)果:
2).根據(jù)下圖的 左連接"全A氮发,A和B的共有加上A的獨(dú)有" 的意思,在員工表以及部門表中寫出相應(yīng)的sql語句冗懦,也即:
得出最終的結(jié)果:
3).根據(jù)下圖的 右連接"全B爽冕,A和B的共有加上B的獨(dú)有" 的意思,在員工表以及部門表中寫出相應(yīng)的sql語句
得出最終的結(jié)果:
4).根據(jù)下圖的 左連接 "A獨(dú)占披蕉,不與B共享" 的意思颈畸,在員工表以及部門表中寫出相應(yīng)的sql語句
得出最終的結(jié)果:
5.根據(jù)下圖的 右連接 "B獨(dú)占,不與A共享" 的意思没讲,寫出相應(yīng)的sql語句眯娱。
得出最終的結(jié)果:
6.全連接:兩張表FULL JOIN 全連接。
得出最終的結(jié)果:
7.左右連接:兩張表沒有共有部分爬凑,左右獨(dú)立連接徙缴。
得出最終的結(jié)果: