| |
| CREATE TABLE IF NOT EXISTS `type` ( |
| `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, |
| `card` INT(10) UNSIGNED NOT NULL, |
| PRIMARY KEY (`id`) |
| ); |
| |
| |
| CREATE TABLE IF NOT EXISTS `book` ( |
| `bookid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, |
| `card` INT(10) UNSIGNED NOT NULL, |
| PRIMARY KEY (`bookid`) |
| ); |
| |
| |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO TYPE(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| |
| |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| |
| |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book ON type.card = book.card; |
| |
| |
| CREATE INDEX Y ON book(card); |
| |
| |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book ON type.card = book.card; |
| |
| |
| CREATE INDEX X ON `type`(card); |
| |
| |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book ON type.card = book.card; |
| |
| |
| DROP INDEX Y ON book; |
| |
| |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book ON type.card = book.card; |
| |
| |
| |
| # 删除索引 |
| DROP INDEX X ON `type`; |
| |
| # 没有索引时测试 |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book ON type.card = book.card; |
| |
| # 添加索引 |
| CREATE INDEX Y ON book(card); |
| |
| # 内连接测试 |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book ON type.card = book.card; |
| |
| # 再添加1个索引 |
| CREATE INDEX X ON `type`(card); |
| |
| # 结论:对于内连接来说,查询优化器可以决定谁作为驱动表,谁作为被驱动表出现的 |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book ON type.card = book.card; |
| |
| # 删除索引 |
| DROP INDEX Y ON book; |
| # 对于内连接来讲,如果表的连接条件中只能有一个字段有索引,则有索引的字段所在的表会被作为被驱动表出现。 |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book ON type.card = book.card; |
| |
| # 再将Y索引添加上 |
| CREATE INDEX Y ON book(card); |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book ON type.card = book.card; |
| |
| # 向type表中添加数据(20条数据) |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| INSERT INTO `type`(card) VALUES(FLOOR(1 + (RAND() * 20))); |
| |
| # 对于内连接来说,在两个表的连接条件都存在索引的情况下,会选择小表作为驱动表。“小表驱动大表” |
| EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book ON type.card = book.card; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
2021-06-17 jdbc操作mysql(三):利用注解封装
2021-06-17 jdbc操作mysql(二):封装