我有一张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 ASC或number DESC) 是否与此查询的性能有关?
发布于 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()表达式执行单键查找,并将其替换为常量。如果将所有表达式替换为常量,则查询将立即返回。例如:
SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE
key_part1=10;发布于 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上创建密钥。
发布于 2013-12-11 23:18:57
Select语句的性能差异很小,而Insert、Update和Delete语句的性能差异更大。
当您在整页的中间插入时,DB引擎应该将一些行移到下一页。如果您有DESC,那么每个INSERT都应该将索引行移动到页面上。DELETE的也一样。
Updates没有受到这样的影响,但是如果您更改索引值,同样的情况也会发生。
https://stackoverflow.com/questions/20531468
复制相似问题