---B+树索引
show create table orders;
| orders | CREATE TABLE `orders` (
`o_orderkey` int(11) NOT NULL,
`o_custkey` int(11) DEFAULT NULL,
`o_orderstatus` char(1) DEFAULT NULL,
`o_totalprice` double DEFAULT NULL,
`o_orderDATE` date DEFAULT NULL,
`o_orderpriority` char(15) DEFAULT NULL,
`o_clerk` char(15) DEFAULT NULL,
`o_shippriority` int(11) DEFAULT NULL,
`o_comment` varchar(79) DEFAULT NULL,
PRIMARY KEY (`o_orderkey`), -- 主键索引
KEY `i_o_orderdate` (`o_orderDATE`), -- 索引列,key 等同于 index
KEY `i_o_custkey` (`o_custkey`) -- 索引列,key 等同于 index
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
SELECT count(1) FROM orders;
+----------+
| count(1) |
+----------+
| 1500000 |
+----------+
SELECT * FROM orders
where o_orderkey=392353;
(root@localhost) [dbt3]> SELECT * FROM orders
-> where o_orderkey=392353;
+------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+
| o_orderkey | o_custkey | o_orderstatus | o_totalprice | o_orderDATE | o_orderpriority | o_clerk | o_shippriority | o_comment |
+------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+
| 392353 | 40570 | O | 155839.52 | 1997-12-02 | 1-URGENT | Clerk#000000874 | 0 | carefully even deposits haggle quickly according to the shea |
+------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+
1 row in set (0.00 sec)
注意此订单表orders 有一百五十万条数据
B+树优点:
使用了 索引 KEY `i_o_custkey` (`o_custkey`) 查询仅需要0.00秒 且查询速度和数据量是没有关系的(即使数量变为一个亿),这个就是B+树的特性。
B+树缺点:
DML(Data Manipulation Language,数据操作语言)代价大,每次操作后都需要对索引字段重新排序。
文件是按照块来存储的 mysql 是按照16k来分块的文件都是按照16k的倍数来算,即使是windows上的文件也是如此,即使文件大小达不到整数倍,也会按照整数存储。
B+树原理例子:
假设你有一个电话号码的电话簿,按字母顺序排列:
电话簿示例:
A-G: 目录1
H-M: 目录2
N-Z: 目录3
当你需要查找“James”的电话时,你会:
看目录1,发现“James”不在这里。
按目录指示,跳到目录2,再找找。
如果“James”在目录2中,你会找到他的电话。如果不在,你会再跳到下一个目录。
如果有太多名字,目录1可能会分裂成两个更小的目录(A-C和D-G),并将新目录的名字提到上面的目录。
优点
快速查找:因为它总是平衡的,你总是需要相同的步数来找到电话,无论电话簿有多大(这就是为什么说数据量不影响查询速度了)。
范围查找:通过叶子节点之间的链表,你可以很快找到一个范围内的所有名字,比如“从A到F”。
B+树就像一个多层次的有序电话簿,通过将数据分层存储和组织,让查找变得快速而高效。无论电话簿有多大,你总是能够以相同的速度找到你想要的电话号码。