MySQL索引排序顺序

时间:2013-12-11 22:42:43

标签: mysql

我有一个Invoice表:

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)
);

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

SELECT MAX(number) + 1
FROM Invoice
WHERE countryCode = 'XX';

我知道此查询将使用索引。

此查询的效果是否存在索引排序顺序number ASCnumber DESC

3 个答案:

答案 0 :(得分:1)

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

  

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

我相信,对于您的陈述,只会在countryCode而不是number上创建密钥。

答案 1 :(得分:1)

我认为您拥有非常优化的索引利用率,因为countryCode是您键的第一部分,而您获得最大值的列是键的第二部分。这里根本不需要排序。查看有关索引利用率的MySQL文档中的这个例外

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

  

查找特定索引列的MIN()或MAX()值   key_col上。这是由检查您是否的预处理器优化的   正在使用WHERE key_part_N =常量发生的所有关键部分   在索引中的key_col之前。在这种情况下,MySQL只做一个密钥   查找每个MIN()或MAX()表达式并用a替换它   不变。如果所有表达式都替换为常量,则查询   马上回来。例如:

SELECT MIN(key_part2),MAX(key_part2)   FROM tbl_name WHERE
key_part1=10;

答案 2 :(得分:1)

Select语句的性能差异较小,但InsertUpdateDelete语句的差异较大。

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

Updates不会受到影响,但如果您更改索引值同样适用。