首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL索引排序顺序

问MySQL索引排序顺序
EN

Stack Overflow用户
提问于 2013-12-11 22:42:43
回答 3查看 2.2K关注 0票数 0

我有一张Invoice桌:

代码语言:javascript
复制
CREATE TABLE Invoice (
    id           INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    countryCode  CHAR(2) NOT NULL,
    number       INT(10) UNSIGNED NOT NULL,

    ...

    PRIMARY KEY(id),
    UNIQUE KEY(countryCode ASC, number ASC)
);

每个国家都必须有自己的顺序发票编号,因此在创建新发票之前,我必须使用以下查询获得该特定国家的下一个序列号:

代码语言:javascript
复制
SELECT MAX(number) + 1
FROM Invoice
WHERE countryCode = 'XX';

我知道这个查询将使用索引。

索引排序顺序 (number ASC或number DESC) 是否与此查询的性能有关?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-11 22:53:32

我认为您有相当多的最佳索引利用率,因为countryCode是您的键的第一部分,而获得最大值的列是键的第二部分。这里根本不需要排序。查看有关索引利用率的MySQL文档中的额外内容。

http://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html

若要查找特定索引列key_col的MIN()或MAX()值,请执行以下操作。这是由一个预处理器优化的,它检查在索引中的key_part_N之前发生的所有关键部分是否使用WHERE =key_part_N=常数。在本例中,MySQL对每个MIN()或MAX()表达式执行单键查找,并将其替换为常量。如果将所有表达式替换为常量,则查询将立即返回。例如:

代码语言:javascript
复制
SELECT MIN(key_part2),MAX(key_part2)   FROM tbl_name WHERE
key_part1=10;
票数 1
EN

Stack Overflow用户

发布于 2013-12-11 22:45:19

来自http://dev.mysql.com/doc/refman/5.1/en/create-table.html

index_col_name规范可以以ASC或DESC结束。这些关键字允许用于将来用于指定升序或降序索引值存储的扩展。当前,它们被解析但被忽略;索引值总是按升序存储。

我相信,您的声明只会在countryCode上创建密钥,而不会在number上创建密钥。

票数 1
EN

Stack Overflow用户

发布于 2013-12-11 23:18:57

Select语句的性能差异很小,而Insert、Update和Delete语句的性能差异更大。

当您在整页的中间插入时,DB引擎应该将一些行移到下一页。如果您有DESC,那么每个INSERT都应该将索引行移动到页面上。DELETE的也一样。

Updates没有受到这样的影响,但是如果您更改索引值,同样的情况也会发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20531468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档