假设我有一个具有唯一整数索引的MySQL表,该索引对于每一行都是自动递增的。
id | PlanetName
---+-----------
0 | Mercury
1 | Venus
2 | Neptune假设我主要对通过唯一索引查找行的查询进行优化。例如:
SELECT PlanetName FROM Planets WHERE id = 2如果我用另一种语言编程,并将数据加载到数组中,那么通过指针算法执行这些查找将非常快。当我在MySQL中执行查询时,我希望能够获得相同的性能。
我的想法是:
因此,如果我为id创建一个唯一的聚集索引,这是否意味着MySQL将执行指针算术类型查找?
发布于 2020-02-19 17:43:34
是也不是。
编程语言中的“数组”执行一些简单的地址算法来快速定位数组中的Nth条目。
在MySQL中,大多数索引构建为B+Trees。(参见Wikipedia)这个结构比数组更复杂,但仍然是最好的。WHERE id=2需要向下钻取一棵“节点树”,以定位"id“列中的"2”项。
与简单的数组相比,BTree有几个优点。这些优点对于数据库操作的通用性是必不可少的。
DELETE * FROM t WHERE id=2。(数组不允许孔;BTrees允许。)请注意,它防止使用“地址算法”来定位记录。WHERE name = 'Venus'。这和使用数字一样容易,而且速度也一样快。WHERE name BETWEEN 'Mars' AND 'Venus'按字母顺序存储。PRIMARY KEY,并将其与数据聚在一起。WHERE id=2,如果id是PK)是一个BTree的向下钻取,以到达整个行。SELECT * FROM t WHERE name='Venus'和INDEX(name))进行查找要复杂一些。首先向下钻取name索引以找到id,然后向下钻取PK+data BTree以查找整行。INSERTing或UPDATEing行时发生这种情况。实际上,它通过PRIMARY KEY (如果给出- cf AUTO_INCREMENT)和每个UNIQUE索引来查找行。如果其中任何一个是匹配的,则会得到一个错误(除非执行INSERT IGNORE)。否则,PK的BTree和唯一的BTrees将采用新的/修改的行。对付潜在的欺骗不是免费的,而是廉价的。BETWEEN,第一行被访问(O(logN)),然后每个后续行都是O(1)。因此,是的,数组查找需要纳秒,这比数据库查找(如果缓存在RAM中)要快,或者毫秒(如果需要I/O )。这是你必须付出的代价,无限的大小和更多的功能。
https://dba.stackexchange.com/questions/259603
复制相似问题