一、引言:小明的图书馆困境与启示

1.1 故事开篇:从混乱到有序的转变

小明大学毕业后开了家"码农图书馆",专门收藏编程技术书籍。刚开始,他把所有书都堆在一个大房间里,按心情随意摆放。

第一天营业:读者问"有没有《MySQL索引优化》这本书?"

小明:"稍等...我翻翻看..."(翻遍整个房间,满头大汗)

读者:"算了,我去隔壁书店看看。"

一个月后:图书馆濒临倒闭,小明意识到必须改变。他开始研究图书管理,发现了一个神奇的结构——B+树目录系统,从此图书馆声名远扬,读者络绎不绝。

这个故事映射着我们今天的主题:数据库查询优化。没有索引的数据库就像混乱的图书馆,有了合适的索引就像有了智能目录系统。

1.2 本章学习目标

通过小明的图书馆故事,你将掌握:

  • 索引的本质:为什么B+树是最佳的数据库索引结构?
  • B+树深度剖析:从定义到MySQL实现的完整链路
  • 索引类型与实战:主键索引、二级索引、联合索引的B+树视角
  • 查询优化:如何写出高效的SQL语句,避免全表扫描
  • 执行计划分析:用EXPLAIN诊断查询性能瓶颈
  • MySQL 5 vs 8索引差异:降序索引、隐藏索引等新特性

特别提醒:索引是把双刃剑!用得好查询飞快,用不好反而拖慢写入性能。本文将告诉你如何平衡利弊。

二、故事展开:小明的图书馆进化史

2.1 第一阶段:无索引的灾难(全表扫描)

问题描述

小明的图书馆最初没有任何目录,每本书只有编号,读者只能通过"遍历所有书架"来找书。

技术映射:这就是数据库的全表扫描(Full Table Scan),当查询没有命中索引时,MySQL会逐行扫描整张表。

SQL实例:全表扫描的痛苦

-- 模拟小明图书馆的书籍表(无索引)
CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(200),
author VARCHAR(100),
category VARCHAR(50),
publish_year INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 插入10万条测试数据(模拟大型图书馆)
INSERT INTO books VALUES
(1, 'MySQL从入门到精通', '张三', '数据库', 2020),
(2, 'Java编程思想', '李四', '编程语言', 2019),
-- ... 更多数据
(100000, 'Redis实战', '王五', '缓存', 2021); -- 查询某本书(触发全表扫描)
SELECT * FROM books WHERE title = 'MySQL索引优化实战';

执行过程分析

  1. MySQL从表的第一行开始,逐行检查title字段
  2. 对比每一行的书名是否匹配
  3. 直到找到目标书或扫描完所有10万行

性能问题

  • 时间复杂度:O(n),数据量越大越慢
  • I/O开销:大量磁盘读取,CPU利用率低
  • 用户体验:读者等待时间过长

避坑提醒SELECT *在大表中慎用!它会读取所有字段,增加I/O开销。应明确指定所需字段。

2.2 第二阶段:简单索引的尝试(二叉查找树)

故事转折

小明决定给图书馆做个简单目录:按书名首字母排序,做成二叉树结构。

技术映射:这就是二叉查找树(BST)索引。

二叉查找树的局限性

小明的二叉树目录很快遇到了问题:

  • 不平衡问题:如果书名按"A、B、C...Z"顺序插入,树会变成"链表",查询效率退化到O(n)
  • 磁盘I/O问题:每次比较都可能触发磁盘读取,效率不高

SQL实例:创建简单索引

-- 为title字段创建普通索引(模拟二叉查找树)
CREATE INDEX idx_title ON books(title); -- 查询时使用索引
SELECT book_id, title, author FROM books WHERE title = 'MySQL索引优化实战';

改进后的效果

  • 查询时间从线性搜索变为对数搜索
  • 但仍存在树不平衡的风险

2.3 第三阶段:B+树的革命性突破(深度剖析)

故事高潮:B+树的诞生

小明学习了更高级的数据结构——B+树,这是现代数据库索引的核心。经过深入研究,他发现B+树就像一个智能化的多层图书馆目录系统

2.3.1 B+树的精确定义与核心特性

B+树是一种多路平衡查找树,专为磁盘等外存设备设计,具有以下核心特性:

  1. 数据集中存储:所有数据记录仅存储在叶子节点,非叶子节点仅存储索引键(用于导航)
  2. 叶子节点链表:所有叶子节点通过双向链表连接,形成有序序列,支持高效范围查询
  3. 树高极低:通常2-4层(百万级数据仅需3次磁盘I/O),确保查询稳定
  4. 平衡性:任何节点的子树高度差不超过1,保证查询路径长度固定

2.3.2 图书馆类比B+树结构(三层目录系统)

小明的B+树目录系统采用三级结构

B+树层级 图书馆对应 存储内容 作用
根节点 总目录(前台大厅) 分类范围+指向下层页码 定位大类区域(如"N-Z")
分支节点 区域细分目录(书架侧) 子范围+指向下层页码 定位子类区域(如"N-Q")
叶子节点 书籍位置清单(书页) 书名+书架位置+页码 存储具体书籍信息,双向链表串联

2.3.3 B+树结构细节(含精准图示)

节点组成与术语

  • 阶数(Order, m):一个节点最多含有的子节点指针数量,故最多存m-1个关键字
  • 非叶子节点:仅存"关键字+子节点指针",用于导航(如"关键字10→指向左子树≤10的节点")
  • 叶子节点:存"关键字+数据记录指针"(聚簇索引存完整数据行,二级索引存主键值),通过双向链表连接

B+树层级结构图示(阶数m=3,关键字为整数)

                    [根节点] (非叶子节点)
/ | \
[A-F] [G-M] [N-Z] (分支节点)
/ \ / \ / \
[A-C] [D-F] [G-I][J-L] [N-P][Q-Z] (分支节点)
| | | | | |
(书1) (书2) (书3) (书4) (书5) (书6) (叶子节点)
↓ ↓ ↓ ↓ ↓ ↓
←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← (双向链表)

图示说明

  • 非叶子节点关键字是子节点的范围分界(如根节点"关键字M"→左子树≤M,右子树>M)
  • 叶子节点通过双向链表串联,支持范围查询(如查"A-C"的所有书籍,直接遍历链表)

2.3.4 B+树在MySQL InnoDB中的实现细节

InnoDB页与B+树节点

  • InnoDB以页(Page,默认16KB) 为基本存储单位,B+树每个节点对应一个页
  • 阶数计算:假设关键字占8字节(BIGINT)、指针占6字节,页大小16KB=16384字节,则单节点最多关键字数:

    (m-1)×(8+6) + 6 ≤ 16384m≈1170(即每个非叶子节点可存1169个关键字、1170个子节点指针)
  • 树高估算:3层B+树可存 1170×1170×16KB≈21GB 数据,4层可存 21GB×1170≈24TB

聚簇索引与二级索引的B+树差异

索引类型 叶子节点存储内容 B+树结构特点 SQL示例
聚簇索引 完整数据行(按主键排序) 叶子节点即数据页,表数据物理有序存储 PRIMARY KEY (id) → 叶子节点存id, name, age...
二级索引 主键值(按索引键排序) 叶子节点存"索引键+主键值",需回表查询 INDEX idx_name (name) → 叶子节点存name, id

回表查询示意图

二级索引B+树(叶子节点存name+id)      聚簇索引B+树(叶子节点存完整数据)
+----------+----------+ +----------+----------+----------+
| name=张三 | id=100 | → 查id=100 → | id=100 | name=张三 | age=20...|
| name=李四 | id=101 | +----------+----------+----------+
+----------+----------+

2.3.5 B+树操作:插入与删除的平衡维护

插入操作(阶数m=4,关键字数最多3个)

  1. 从根节点出发,找到插入目标叶子节点
  2. 若叶子节点未满(关键字数<3),直接插入并排序
  3. 若叶子节点已满(如[5,8,10]),则分裂
    • 中间关键字(8)上移至父节点
    • 剩余关键字分裂为左右节点([5]和[10])
  4. 若父节点也满,则递归分裂(根节点分裂会导致树高+1)

删除操作(阶数m=4,下溢阈值=1个关键字)

  1. 找到目标关键字所在叶子节点
  2. 若节点关键字数>1(未下溢),直接删除
  3. 若下溢(如只剩1个关键字),则借位/合并
    • 借位:从兄弟节点借1个关键字(父节点关键字下移)
    • 合并:与兄弟节点合并,父节点关键字下移(递归处理父节点下溢)

2.3.6 B+树 vs B树:为什么数据库选B+树?

对比维度 B树 B+树 数据库场景优势
数据存储位置 所有节点(非叶子+叶子) 仅叶子节点 B+树非叶子节点更小→树高更低→I/O更少
叶子节点连接 无链表 双向链表 范围查询无需回溯上层→效率提升10倍+
查询稳定性 可能在非叶子节点找到数据 必须到叶子节点→路径长度固定 性能稳定,无"偶发快、经常慢"问题
空间利用率 非叶子节点存数据→浪费空间 非叶子节点仅存索引键→空间利用率高 相同磁盘空间存更多索引→减少I/O次数

2.3.7 MySQL中的B+树实现验证

-- 查看表的索引信息(了解B+树结构)
SHOW INDEX FROM books; -- 输出示例:
-- Table: books
-- Non_unique: 0 (主键索引) / 1 (普通索引)
-- Key_name: PRIMARY / idx_title
-- Seq_in_index: 1 (索引中字段的顺序)
-- Column_name: book_id / title
-- Collation: A (升序) / NULL
-- Cardinality: 约100000 (索引基数,估算的唯一值数量)
-- Sub_part: NULL (前缀索引长度)
-- Packed: NULL
-- Null:
-- Index_type: BTREE (B+树类型)
-- Comment:

核心知识点:MySQL InnoDB存储引擎使用B+树作为默认索引结构,而非B树!B+树的所有数据都存储在叶子节点,且叶子节点间有双向链表连接,这使得范围查询极其高效。

三、索引类型详解与实战应用(B+树视角)

3.1 主键索引(聚簇索引)——图书馆的"书号目录"

故事背景

小明给每本书分配了唯一的书号(如ISBN),按书号顺序排列,这就是主键索引。在B+树中,主键索引的叶子节点存储完整数据行。

技术特点

  • 聚簇索引:数据行按主键顺序物理存储,B+树叶子节点即数据页
  • 唯一性:主键值必须唯一且非空
  • 自动创建:InnoDB会自动为主键创建聚簇索引

SQL实例:主键索引操作

-- 创建表时指定主键(自动创建聚簇索引)
CREATE TABLE books (
book_id INT AUTO_INCREMENT PRIMARY KEY, -- 主键(聚簇索引)
isbn VARCHAR(20) UNIQUE NOT NULL, -- 唯一索引
title VARCHAR(200) NOT NULL,
author VARCHAR(100),
INDEX idx_author (author) -- 普通二级索引
) ENGINE=InnoDB; -- 查看主键索引信息
SHOW KEYS FROM books WHERE Key_name = 'PRIMARY'; -- MySQL 8.0特有:降序主键索引(实验性特性)
CREATE TABLE books_desc (
book_id INT PRIMARY KEY DESC, -- 降序聚簇索引
title VARCHAR(200)
) ENGINE=InnoDB;

聚簇索引的B+树优势

  • 主键查询极快(直接定位到数据行)
  • 范围查询效率高(数据物理连续存储)

3.2 二级索引(非聚簇索引)——图书馆的"作者目录"

故事背景

除了书号目录,小明还制作了"作者目录",通过作者姓名快速找到书籍位置。这就是二级索引。在B+树中,二级索引的叶子节点存储"索引键+主键值"。

技术特点

  • 非聚簇索引:索引结构与数据存储分离,B+树叶子节点存"索引键+主键值"
  • 回表查询:通过二级索引找到主键后,需再查聚簇索引获取完整数据
  • 可多个:一张表可以有多个二级索引

SQL实例:二级索引操作

-- 创建二级索引(作者索引)
CREATE INDEX idx_author ON books(author); -- 使用二级索引查询(触发回表)
SELECT book_id, title, author
FROM books
WHERE author = '张三'; -- 先查author索引的B+树,再回表查聚簇索引 -- MySQL 8.0特有:隐藏索引(测试索引效果而不影响生产)
ALTER TABLE books ALTER INDEX idx_author INVISIBLE; -- 隐藏索引
ALTER TABLE books ALTER INDEX idx_author VISIBLE; -- 重新启用

性能提醒:过多的二级索引会影响INSERT/UPDATE/DELETE性能,因为每次数据变更都需要更新所有相关B+树索引。

3.3 联合索引——图书馆的"复合目录"

故事背景

小明发现很多读者喜欢按"分类+出版年份"找书,于是制作了复合目录:先按分类,再按年份排序。这就是联合索引,在B+树中表现为多字段组合的有序结构。

技术特点

  • 最左前缀原则:查询时必须从左到右使用索引字段(B+树的有序性决定)
  • 索引覆盖:如果查询字段都在联合索引中,无需回表
  • 排序优化:联合索引可以优化ORDER BY操作

SQL实例:联合索引操作

-- 创建联合索引(分类+出版年份)
CREATE INDEX idx_category_year ON books(category, publish_year); -- 正确使用:符合最左前缀原则
SELECT * FROM books
WHERE category = '数据库'
AND publish_year = 2020; -- 使用整个联合索引的B+树 -- 正确使用:使用索引前缀
SELECT * FROM books
WHERE category = '数据库'; -- 使用category部分的B+树 -- 错误使用:跳过左边字段
SELECT * FROM books
WHERE publish_year = 2020; -- 无法使用联合索引的B+树! -- MySQL 8.0特有:降序联合索引
CREATE INDEX idx_category_year_desc ON books(category ASC, publish_year DESC);

重点提醒:联合索引的字段顺序很重要!应将选择性高的字段放在前面(区分度大的字段),这样可以快速缩小B+树查询范围。

四、查询优化实战:小明的性能调优之路

4.1 慢查询识别与定位

故事发展

随着图书馆规模扩大,小明发现有些查询越来越慢。他需要一套性能监控系统

技术实现:开启慢查询日志

-- 查看慢查询日志配置
SHOW VARIABLES LIKE 'slow_query%'; -- 开启慢查询日志(MySQL 5/8通用)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- 超过2秒的查询记录到慢日志
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log'; -- MySQL 8.0特有:更精细的控制
SET PERSIST slow_query_log = ON; -- 持久化配置(重启后生效)
SET PERSIST long_query_time = 1; -- 1秒以上记录

4.2 EXPLAIN执行计划分析(B+树视角)

故事高潮:小明的"查询侦探"工具

小明发明了"查询侦探"工具,可以追踪每一次查询的执行路径。这个工具就是MySQL的EXPLAIN命令,它能告诉我们查询是如何在B+树中导航的。

EXPLAIN命令详解

-- 基本用法
EXPLAIN SELECT * FROM books WHERE author = '张三' AND category = '数据库'; -- MySQL 8.0特有:EXPLAIN FORMAT=JSON(更详细信息)
EXPLAIN FORMAT=JSON SELECT * FROM books WHERE title LIKE 'MySQL%';

EXPLAIN输出字段详解

字段名 含义 B+树相关 优化目标 示例值
type 访问类型(性能关键) B+树查询路径类型 追求const/ref/range ALL(全表扫描,未命中B+树)
key 实际使用的索引 命中的B+树索引名 不为NULL idx_author
rows 预估扫描行数 B+树中需检查的节点数 越小越好 1000
Extra 额外信息 B+树操作详情 避免Using filesort Using where

访问类型(type)性能排序(B+树查询路径)

-- 1. const: 主键或唯一索引等值查询(B+树直接定位叶子节点)
EXPLAIN SELECT * FROM books WHERE book_id = 1; -- 2. ref: 非唯一索引等值查询(B+树叶子节点扫描)
EXPLAIN SELECT * FROM books WHERE author = '张三'; -- 3. range: 索引范围查询(B+树范围扫描)
EXPLAIN SELECT * FROM books WHERE publish_year BETWEEN 2020 AND 2022; -- 4. ALL: 全表扫描(未使用B+树索引)
EXPLAIN SELECT * FROM books WHERE title LIKE '%MySQL%';

4.3 常见索引失效场景与解决方案

故事收尾:小明的"避坑手册"

经过多年实践,小明总结了索引失效的常见场景,编成了"避坑手册"。

失效场景 示例代码 B+树失效原因 解决方案
LIKE以%开头 WHERE name LIKE '%张三' B+树无法前缀匹配 改为'张三%'或用全文索引
类型隐式转换 WHERE phone = 13800138000 字符串转数字,B+树失效 WHERE phone = '13800138000'
OR条件不全有索引 WHERE a=1 OR b=2 优化器放弃B+树索引 为b字段加索引,或改写为UNION

五、MySQL 5 vs 8索引特性对比

5.1 版本差异一览表

特性 MySQL 5.7 MySQL 8.0 B+树相关应用场景
降序索引 不支持(存储为升序) 支持INDEX idx_name (col DESC) 优化ORDER BY DESC的B+树查询
隐藏索引 不支持 支持ALTER INDEX idx_name INVISIBLE 测试B+树索引效果,平滑下线
函数索引 不支持 支持INDEX idx_func ((UPPER(name))) 优化函数计算的B+树查询

5.2 MySQL 8.0新特性实战

-- 1. 降序索引(优化B+树排序查询)
CREATE INDEX idx_date_desc ON events(event_date DESC); -- 2. 隐藏索引(测试B+树索引效果)
ALTER TABLE books ALTER INDEX idx_author INVISIBLE; -- 3. 函数索引(优化B+树函数查询)
CREATE INDEX idx_upper_title ON books((UPPER(title)));

六、总结与展望

6.1 小明的成功秘诀

通过小明的图书馆故事,我们学到了:

  • B+树本质:有序的多路平衡查找树,专为磁盘存储设计
  • 索引策略:合理选择索引类型,遵循最左前缀原则,理解B+树的有序性
  • 查询优化:用EXPLAIN分析B+树查询路径,避免索引失效
  • 版本适配:MySQL 8.0的新特性进一步优化B+树性能

6.2 下一步学习路径

掌握了B+树索引与查询优化后,下一站是:

  • 事务与锁机制:理解ACID特性,掌握并发控制
  • 数据库架构:主从复制、读写分离、分库分表
  • 高可用方案:MHA、Orchestrator、InnoDB Cluster

学习建议:理论学习后,一定要在实际项目中练习!可以用sysbench生成测试数据,用EXPLAIN分析各种B+树查询场景,逐步培养"性能直觉"。

附录:B+树索引优化命令速查表

A.1 B+树索引管理命令

命令 作用 B+树相关 示例
CREATE INDEX idx_name ON table(column) 创建普通B+树索引 构建单列B+树 CREATE INDEX idx_name ON users(name);
SHOW INDEX FROM table 查看表的所有B+树索引 显示B+树结构信息 SHOW INDEX FROM books;
EXPLAIN SELECT ... 分析B+树查询执行计划 显示B+树查询路径 EXPLAIN SELECT * FROM books WHERE author='张三';

A.2 B+树结构示意图(简化版)

【根节点B+树】→【分支节点B+树】→【叶子节点B+树1】【叶子节点B+树2】...(双向链表)

通过小明的故事与B+树的深度剖析,我们揭开了MySQL索引的神秘面纱。记住:索引优化的本质是让查询在B+树中走最短路径,减少磁盘I/O。下一篇,我们将探索事务与锁机制,揭开数据一致性的面纱!

MySQL索引原理与查询优化实战:从B+树到执行计划分析的更多相关文章

  1. MySQL索引原理以及查询优化

    转载自:https://www.cnblogs.com/bypp/p/7755307.html MySQL索引原理以及查询优化 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且 ...

  2. mysql 索引原理及查询优化 -转载

    转载自 mysql 索引原理及查询优化 https://www.cnblogs.com/panfb/p/8043681.html 潘红伟   mysql 索引原理及查询优化 一 介绍 为何要有索引? ...

  3. day 7-19 Mysql索引原理与查询优化

    一,介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语 ...

  4. 【mysql】索引原理-MySQL索引原理以及查询优化

    转载:https://www.cnblogs.com/bypp/p/7755307.html 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性 ...

  5. mysql 索引原理及查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  6. MySQL 索引原理概述及慢查询优化实战

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位 ...

  7. MySQL索引原理及慢查询优化

    原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...

  8. (转)MySQL索引原理及慢查询优化

    转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...

  9. MySQL索引原理及慢查询优化 转载

    原文地址: http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能 ...

  10. MySQL索引原理及慢查询优化(转)

    add by zhj:这是美团点评技术团队的一篇文章,讲的挺不错的. 原文:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰 ...

随机推荐

  1. Power BI制作指标达成跟踪器

    Power BI制作指标达成跟踪器 在报告分析中,我们通常会想知道,比如我的一个指标,处于哪个阶段当中.类似的应用场景比如: 销售的达成处于哪个支付区间. 显示成绩的分布,比如60分及格,85分优秀. ...

  2. 鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress

    大家好,我是潘Sir,持续分享IT技术,帮你少走弯路.<鸿蒙应用开发从入门到项目实战>系列文章持续更新中,陆续更新AI+编程.企业级项目实战等原创内容.欢迎关注! ArkUI提供了丰富的系 ...

  3. 实现Serv-U自动停止服务后自动重新启动

    网上所有的Serv-U破解版都存在自动停止服务的问题,每次停止服务都需要手动开启,十分麻烦.通过网络搜索,发现可以使用Serv-U自带的"服务器事件"功能,实现Serv-U自动停止 ...

  4. 本地编译安装python包时,指定版本

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  5. PHP "真异步" TrueAsync SAPI 与 NGINX Unit 集成

    PHP "真异步" TrueAsync SAPI 与 NGINX Unit 集成 现在的 Web 开发和过去最大的区别是什么?一句话:没人再愿意等服务器响应了. 七八年前,甚至更早 ...

  6. Angular使用 ng-cli 创建一个新的 Angular 应用程序,基于 TypeScript

    Angular使用 ng-cli 创建一个新的 Angular 应用程序,基于 TypeScript NextJS使用 TypeScript 或 JS 创建一个新的全栈 NextJS 应用程序,带有服 ...

  7. 开发常见问题汇总 --- pip install 软件安装失败

    pip默认使用国外官方的软件源,时常不稳定.更新为国内软件源 临时修改,例如 pip install pycryptodome -i http://pypi.douban.com/simple/ -- ...

  8. 常见问题解决 --- 若依vue部署前后端 502 (Bad Gateway)

    nginx配置文件中配置代理访问 这里配置的proxy_pass是后台接口的代理 location /prod-api/ { proxy_set_header Host $http_host; pro ...

  9. 基于GA-PSO遗传粒子群混合优化算法的TSP问题求解matlab仿真

    1.程序功能描述 旅行商问题(Traveling Salesman Problem, TSP)是组合优化领域的一个经典NP难问题,旨在寻找访问一系列城市并返回起点的最短路径.本文将详细介绍基于GA-P ...

  10. 12.Springsecurity简单总结

    关于springsecurity的介绍 后面我接触的应该是这个和Shiro !!!一个网站很重要很重要的是安全问题 (狂神说的) 哈哈我觉得更重要的是编写吧 来看吧 maven依赖 这个肯定很重要 t ...