我有一个约有500,000行的表,带有一个复合主键索引。我正在尝试如下的简单选择语句
select * from transactions where account_id='1' and transaction_id='003a4955acdbcf72b5909f122f84d';
解释说明给了我
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra
-------------------------------------------------------------------------------------------------------------------------------------
1 | SIMPLE | transactions | NULL | const | PRIMARY | PRIMARY | 94 | const,const | 1 | 100.00 | NULL
我的主要索引在account_id和transaction_id上。 我的引擎是InnoDB。
运行查询时,大约需要156毫秒。
给出的解释表明只需要检查一行,我不确定如何进一步优化它。我可以做些什么改变来显着改善呢?
答案 0 :(得分:2)
鉴于提供的信息,我将稍作推测:您的主键由一个整数字段account_id
和一个称为varchar
的{{1}}组成。
由于它们都是在将transaction_id
定义为PRIMARY
时创建的PRIMARY KEY(account_id, transaction_id)
索引的组成部分,因此原样是您所能拥有的最好的。>
我认为这里的瓶颈是transaction_id
:作为字符串,需要更多的精力来进行索引和搜索。将其类型更改为其他更容易搜索的类型(即数字)可能会有所帮助。
我看到的唯一其他改进是通过删除PRIMARY KEY
字段来简化account_id
本身(对我来说这似乎没有用,因为transaction_id
感觉像是独一无二的,但是取决于您的设计)或通过将整个密钥替换为整数AUTO INCREMENT
值(不推荐)。