mysqlä¸ï¼ç´¢å¼æ¯åå¨å¼æå®ç°çï¼ä¸åçåå¨å¼æç´¢å¼ç工使¹å¼ä¸ä¸æ ·ï¼ç±äºmysqlé»è®¤çåå¨å¼æä¸ºInnoDBï¼æä»¥ä¸é¢é½æ¯åºäºInnoDBçä¾åã
1ãæ¥è¯¢æ¡ä»¶ä¸æor
å建ä¸ä¸ªuser 表åä¸ä¸ªjob表ï¼å»ºè¡¨è¯å¥å¦ä¸ï¼
CREATE TABLE `user` (
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `index_name` (`name`),
KEY `index_age` (`age`),
KEY `index_address` (`address`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `job` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) DEFAULT NULL,
`job` varchar(255) DEFAULT NULL,
`name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name_index` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
æ§è¡å¦ä¸sql
ä¸ä¾sqlä¸nameåæ®µä¸æç´¢å¼index_nameï¼ä¸é¢æ¥ç䏿§è¡è®¡åï¼

type为Allï¼ä»ç¶æ¯èµ°çå ¨è¡¨æ«æã
2ãlikeæ¥è¯¢æ¯ä»¥â%'å¼å¤´
ä»ç¶ç¨1ä¸çuser表æ§è¡å¦ä¸sql
ä¸ä¾sqlä¸nameä¸æç´¢å¼index_nameï¼ä¸é¢æ¥ç䏿§è¡è®¡åï¼
type为Allï¼ä»ç¶æ¯èµ°çå ¨è¡¨æ«æã 使¯å¦ææ³è®©ä»¥â%âå¼å¤´ä»ç¶ä½¿ç¨ç´¢å¼ï¼åéè¦ä½¿ç¨è¦çç´¢å¼ï¼å³åªæ¥è¯¢å¸¦ç´¢å¼å段çåï¼
å¦ä¸ï¼æ§è¡è®¡åéçkeyç¨å°äºindex_nameã
3ã对æ¥è¯¢çå䏿è¿ç®æè 彿°ç
ä»ç¶ç¨1ä¸çuser表æ§è¡å¦ä¸sql
ä¸ä¾sqlä¸nameä¸æç´¢å¼index_nameï¼ä¸é¢æ¥ç䏿§è¡è®¡åï¼
忝å¦ï¼
ä¸ä¾ä¸ageæç´¢å¼index_ageï¼æ§è¡è®¡åå¦ä¸ï¼
4ã妿åç±»åæ¯å符串ï¼é£ä¸å®è¦å¨æ¡ä»¶ä¸å°æ°æ®ä½¿ç¨å¼å·å¼ç¨èµ·æ¥,å¦åä¸ä½¿ç¨ç´¢å¼
ä»ç¶ç¨1ä¸çuser表æ§è¡å¦ä¸sql
ä¸ä¾sqlä¸nameä¸æç´¢å¼index_nameï¼ä¸é¢æ¥ç䏿§è¡è®¡åï¼
åæ ·ï¼æ²¡æç¨å°ç´¢å¼èµ°çå ¨è¡¨æ«æã
è¿éé¢çåå å ¶å®è·ä¾3æ¯ä¸æ ·çï¼é¦å mysqlæä¸ªç±»å转æ¢è§åå°±æ¯å°âåç¬¦è½¬ææ°åâï¼æä»¥ä»¥ä¸sqlå°±çä»·äºè¿æ ·ï¼
徿æ¾ï¼nameåæ®µä¸æå½æ°ãæä»¥è·ä¾3䏿 ·çåå ãä¸ä¼èµ°ç´¢å¼ã
5ãå·¦è¿æ¥æ¥è¯¢æè å³è¿æ¥æ¥è¯¢æ¥è¯¢å ³èçåæ®µç¼ç æ ¼å¼ä¸ä¸æ ·
é¦å åæ ·å»ºä¸¤å¼ 表ï¼ä¸ä¸ªuserï¼ä¸ä¸ªjobï¼å»ºè¡¨è¯å¥å¦ä¸ï¼
CREATE TABLE `user` (
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `index_name` (`name`),
KEY `index_age` (`age`),
KEY `index_address` (`address`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `job` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) DEFAULT NULL,
`job` varchar(255) DEFAULT NULL,
`name` varchar(255) CHARACTER SET gbk COLLATE gbk_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
注æuser 表çnameåæ®µç¼ç æ¯utf8mb4ï¼èjob表çnameåæ®µç¼ç 为gbkãæ§è¡å·¦å¤è¿æ¥æ¥è¯¢ï¼
EXPLAIN select a.name,b.name,b.job
from
user a
left JOIN job b
ON a.name =b.name
æ§è¡è®¡åå¦ä¸ï¼
b表ä»ç¶èµ°çå ¨è¡¨æ«æãæ³¨æå¦ææ¯ç¨è¦çç´¢å¼çè¯ï¼é£ä¹b表就ä¼èµ°ç´¢å¼äºã
6ã妿mysql估计使ç¨å ¨è¡¨æ«æè¦æ¯ä½¿ç¨ç´¢å¼å¿«,åä¸ä½¿ç¨ç´¢å¼
è¿ä¸ªä¸¾ä¾è¿ç¨user表åjob表ï¼åªä¸è¿æä»¬å¾è¡¨éé¢å°æå ¥ä¸äºæ°æ®ï¼å»ºè¡¨å¦ä¸ï¼
CREATE TABLE `user` (
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `index_name` (`name`),
KEY `index_age` (`age`),
KEY `index_address` (`address`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `test`.`user`(`name`, `age`, `address`, `id`) VALUES ('å
头强', 12, 'ççå²', 1);
INSERT INTO `test`.`user`(`name`, `age`, `address`, `id`) VALUES ('ç大', 9, 'ççå²2', 2);
CREATE TABLE `job` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) DEFAULT NULL,
`job` varchar(255) DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `test`.`job`(`id`, `userId`, `job`, `name`) VALUES (1, 1, 'java', 'å
头强');
INSERT INTO `test`.`job`(`id`, `userId`, `job`, `name`) VALUES (2, 2, 'php', 'ç大');
è¿æ¯æ§è¡ä¸é¢çæ¥è¯¢ï¼
EXPLAIN select a.name,b.name,b.job
from
user a
left JOIN job b
ON a.name =b.name
æ§è¡è®¡åå¦ä¸ï¼
æ¤æ¶ï¼ç±äºè¦æ¥è¯¢b.nameï¼mysqléè¦å表ï¼mysqlè®¤ä¸ºèµ°å ¨è¡¨æ«æä¼å¿«ä¸äºï¼æä»¥å³ä½¿b表çnameæç´¢å¼ï¼ä¹ä¸ä¼èµ°ã
7ãè¿æ¥æ¥è¯¢ä¸ï¼æç §ä¼åå¨é¡ºåºç第ä¸å¼ 表ä¸ä¼èµ°ç´¢å¼
è¿ä¸ªå¯è½å¬èµ·æ¥æç¹æµé¼ï¼ä¸¾ä¸ªæ åï¼ä»ç¶å»ºä¸¤å¼ 表ï¼å»ºè¡¨è¯å¥å¦ä¸ï¼
CREATE TABLE `user` (
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `index_name` (`name`),
KEY `index_age` (`age`),
KEY `index_address` (`address`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `test`.`user`(`name`, `age`, `address`, `id`) VALUES ('å
头强', 12, 'ççå²', 1);
INSERT INTO `test`.`user`(`name`, `age`, `address`, `id`) VALUES ('ç大', 9, 'ççå²2', 2);
CREATE TABLE `job` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) DEFAULT NULL,
`job` varchar(255) DEFAULT NULL,
`name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
æå ¥æ°æ®çinsertè¯å¥å°±ä¸åäºï¼è¦å¤æå ¥ä¸äºï¼å¦åä¸é¢æ¼ç¤ºä¼å¤±æï¼å ä¸ºæ°æ®å°mysqlè®¤ä¸ºèµ°å ¨è¡¨æ«é¢å¿«ä¸äºï¼å°±æä¹é½ç¨ä¸å°ç´¢å¼äºã
æ§è¡æ¥è¯¢ï¼
EXPLAIN select a.name,a.age,b.name,b.job
from
user a
left JOIN job b
ON a.name =b.name
æ¤æ¶a表userä¸çnameæ¯æç´¢å¼çï¼b表nameæ ç´¢å¼ï¼ç䏿§è¡è®¡å
a表ï¼bè¡¨é½æ¯å ¨è¡¨æ«æï¼è建表è¯å¥ä¸åï¼æå·¦å¤è¿æ¥æ¹ä¸ºå³å¤è¿æ¥
EXPLAIN select a.name,a.age,b.name,b.job
from
user a
right JOIN job b
ON a.name =b.name
æ§è¡è®¡åå¦ä¸ï¼
å¯ä»¥çå°ï¼a表ç¨å°äºç´¢å¼ï¼åæ ·ï¼å°å³è¿æ¥æ¹ä¸ºå è¿æ¥åçä¸
EXPLAIN select a.name,a.age,b.name,b.job
from
user a
inner JOIN job b
ON a.name =b.name
æ§è¡è®¡åå¦ä¸ï¼
åæ ·ï¼aè¡¨ä¹æ¯ç¨å°äºç´¢å¼ï¼ä»ä¸é¢ä¸ä¸ªè¿æ¥æ¥è¯¢æ¥çåªæå·¦å¤è¿æ¥a表没æç¨å°ç´¢å¼çï¼è¿å°±æ¯å 为ç±äºæ¯å·¦å¤è¿æ¥ï¼æä»¥ä¼åå¨çæ§è¡é¡ºåºæ¯a表ãb表ï¼ä¹å°±æ¯è¯´é¦å å ¨è¡¨æ«æa表ï¼åæ ¹æ®a表çnameæ¥è¯¢b表çå¼ï¼æä»¥aè¡¨æ æ³ç¨å°ç´¢å¼ãç¨æ®µä¼ªä»£ç è§£éä¸ï¼
//mysql代ç
select a.name,a.age,b.name,b.job
from
user a
left JOIN job b
ON a.name =b.name
//ç¸å½äºæ§è¡ä»¥ä¸å¾ªç¯
List<Map<String,Object>> resultA=select a.name,a.age from user a
for(Map<String,Object> map: resultA){
List<Map<String,Object>> resultB=select b.name,b.job from job b where b.name=map.get("name")
}
ä»è¿æ®µä¼ªä»£ç å¯ä»¥çå°a表没æwhereè¯å¥ï¼æä»¥æ ¹æ¬æ æ³ç¨å°nameä¸çç´¢å¼ï¼èbè¡¨æ¤æ¶nameä¸è¥æ ç´¢å¼çè¯ï¼å¯¼è´ä¸¤ä¸ªè¡¨é½æ¯å ¨è¡¨æ«æï¼æä»¥ä¸è¬è¿ç§è¿æ¥æ¥è¯¢ï¼Aè¡¨å ³èB表ï¼è¦å¨å°ä¼åå¨é¡ºåºç第äºå¼ 表ä¸å ³èçåæ®µä¸å ç´¢å¼ï¼è第ä¸å¼ è¡¨åæ éå ç´¢å¼ï¼æ ç¨çç´¢å¼ä¹ä¼å½±åæ§è½ãè第ä¸ä¸ªä¾åä¸å è¿æ¥å°±ä¸ä¸æ ·äºï¼å¦ææ¯å è¿æ¥ä¼å卿¬èº«å°±ä¼æ ¹æ®ç´¢å¼æ åµï¼è¿æ¥è¡¨ç大å°çå»éæ©æ§è¡é¡ºåºäºï¼æä»¥ä¸ä¾ä¸çå è¿æ¥æ§è¡é¡ºåºæ¯bãaï¼è¿æ ·ä»ç¶å¯ä»¥ç¨å°açç´¢å¼ã
8ã妿æ¥è¯¢ä¸æ²¡æç¨å°èåç´¢å¼ç第ä¸ä¸ªå段ï¼åä¸ä¼èµ°ç´¢å¼
建ç«job表å¦ä¸ï¼
CREATE TABLE `job` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) DEFAULT NULL,
`job` varchar(255) DEFAULT NULL,
`name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name_index` (`name`,`job`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
æ§è¡æ¥è¯¢
æ§è¡è®¡åå¦ä¸ï¼
èµ°çæ¯å ¨è¡¨æ«æã
åèååå®¢ï¼æ»ç»mysqlç´¢å¼å¤±æçNç§æ åµ