note
note copied to clipboard
Innodb 不同编码集、类型、长度的表,join 时能否用上索引?
é®é¢
æ们ç¥é utf8mb4 æ¯ååå ¼å®¹ utf8 å符éçï¼ä¹å°±æ¯è¯´ utf8mb4 å®å ¨å å« utf8ã
é£ä¹ä½¿ç¨ utf8mb4ãutf8 å符éçä¸å表ï¼å¨ join æ¶è½å¦ç¨ä¸ç´¢å¼ï¼left join 顺åºæ¹åæ¯å¦è½æ¹åç»æå¢ï¼
å¦æå ³èå段çç±»ååç¼ç éä¸æ ·ï¼ä¸åçé¿åº¦è½å¦ä½¿ç¨ä¸ç´¢å¼å¢ï¼
å¦æå ³èå段çç¼ç éä¸æ ·ï¼ä¸åçç±»åè½å¦ä½¿ç¨ä¸ç´¢å¼å¢ï¼
åæ
ä¸é¢éè¿å¦ç表ãç级表çä¾åæ¥
DDL å¦ä¸ï¼
// ç级表
CREATE TABLE `clazz` (
`id` int(11) NOT NULL,
`class` varchar(10) DEFAULT NULL,
`class_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
// å¦ç表
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`class` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_class` (`class`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
SQL æ¥è¯¢è¯å¥ï¼
explain select * from clazz left join student on student.class = clazz.class;
å®éªç»æ
ä¸åç¼ç éè½å¦ä½¿ç¨ç´¢å¼
clazz.class | student.class | è½å¦ä½¿ç¨ç´¢å¼
utf8 | utf8 | è½
utf8mb4 | utf8mb4 | è½
utf8 | utf8mb4 | è½
utf8mb4 | utf8 | ä¸è½
ä¸åé¿åº¦è½å¦ä½¿ç¨ç´¢å¼
clazz.class | student.class | è½å¦ä½¿ç¨ç´¢å¼
10 | 10 | è½
10 | 5 | è½
5 | 10 | è½
ä¸åç±»åè½å¦ä½¿ç¨ç´¢å¼
clazz.class | student.class | è½å¦ä½¿ç¨ç´¢å¼
char | varchar | è½
varchar | char | è½
varchar | int | è½
int | varchar | ä¸è½
ç»è®º
- ç¼ç éãç±»åãé¿åº¦ä¸æ ·çæ åµä¸ï¼è½ä½¿ç¨ç´¢å¼ï¼æ¯«æ çé®ï¼
- ç¨ utf8 å» left join utf8mb4 表å段çæ¶åï¼è½ä½¿ç¨ä¸ç´¢å¼ï¼åè¿æ¥ç¨ utf8mb4 å» left join utf8 åä¸è½ä½¿ç¨ä¸ç´¢å¼ãè¿æ¯è¾å¥½çè§£ï¼ utf8mb4 å ¼å®¹ utf8 åï¼æ以ï¼utf8 çä»»ä½ä¸ä¸ªå段ï¼é½è½å¹é ä¸ utf8mb4
- ç¸åç±»åãä¸åé¿åº¦ç joinï¼é½è½ä½¿ç¨ä¸ç´¢å¼
- charãvarchar ä¹é´ç joinï¼é½è½ä½¿ç¨ä¸ç´¢å¼
- varchar å» left join int æ¶ï¼è½ä½¿ç¨ä¸ç´¢å¼ï¼è int left join varchar åä¸è½ãå强çè§£ä¸ºï¼ varchar åå¨çäºè¿å¶å¯ä»¥å½åºä¸ä¸ªæ°åï¼è int åå¨çæ°åä¸è½è½¬æä¸ä¸ª varcharï¼æ以ä¸è½
个人è§è§£ï¼å¦ææåæä¸æ£ç¡®çå°æ¹ï¼æ¬¢è¿æåºäº¤æµï¼