非主键列上的MySQL索引

非主键列上的MySQL索引,mysql,database,indexing,primary-key,Mysql,Database,Indexing,Primary Key,我在一个相当大的表上运行一些MySQL查询(不是Facebook规模的,而是大约一百万行),我发现它们非常慢。我怀疑原因是我正在查询id字段,但id未声明为主键,也未声明索引 我无法将id字段设置为主键,因为它不是唯一的,尽管它的基数非常接近1。在这种情况下,如果我做一个altertable在id字段上添加一个索引,如果它不是主键,是否应该提高查询速度 假设是这样的话,索引需要多长时间才能完全发展,以便查询开始快速执行?我的意思是,在执行alter table之后出现提示的那一刻,或者即使出现提

我在一个相当大的表上运行一些MySQL查询(不是Facebook规模的,而是大约一百万行),我发现它们非常慢。我怀疑原因是我正在查询
id
字段,但
id
未声明为主键,也未声明索引

我无法将
id
字段设置为主键,因为它不是唯一的,尽管它的基数非常接近1。在这种情况下,如果我做一个
altertable
id
字段上添加一个索引,如果它不是主键,是否应该提高查询速度


假设是这样的话,索引需要多长时间才能完全发展,以便查询开始快速执行?我的意思是,在执行
alter table
之后出现提示的那一刻,或者即使出现提示,索引构建也会在内部持续相当长的一段时间?(在执行此操作之前我会询问,因为我不确定在非唯一字段上声明索引是否会损坏数据库)

任何索引都会加快与相应列匹配的查询速度。在这方面,主键和其他索引之间没有显著差异


执行
altertable
查询时,会立即创建索引。当提示返回时,索引就在那里并将被使用。发生这种情况时没有损坏。

酷。在我的例子中,由于基数非常接近于1,索引的工作方式和主键字段一样好,对吗?性能是否会显著下降?而且,索引的创建不是一个复杂的过程吗?如何立即完成?将其用作主键是否有意义取决于您的应用程序。我说过索引是立即创建的,而不是瞬间创建的。如果表很大,则需要时间,但在完成之前不会返回提示--这不仅仅是开始后台任务。哦,好吧。谢谢!