我有一个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
)?
答案 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
语句的性能差异较小,但Insert
,Update
和Delete
语句的差异较大。
当您在整页的中间插入时,数据库引擎应将某些行移动到下一页。如果您有DESC
,那么每个INSERT
都应该在页面上移动索引行。 DELETE
个相同。
Updates
不会受到影响,但如果您更改索引值同样适用。