MySQL索引性能…索引位置取决于状态

MySQL索引性能…索引位置取决于状态,mysql,performance,indexing,Mysql,Performance,Indexing,该表包含4列:id autoincrement、userid unique、like ssn、status TINYINT1、0或1值、notnull、user\u info varchar1000 如果出现以下情况,我是否应该在userid列上添加索引以提高性能: 30%的请求是 "SELECT user_info from Table1 WHERE userid='1234567'"; 40%的请求是: "SELECT user_info from Table1 WHERE userid=

该表包含4列:id autoincrement、userid unique、like ssn、status TINYINT1、0或1值、notnull、user\u info varchar1000

如果出现以下情况,我是否应该在userid列上添加索引以提高性能: 30%的请求是

"SELECT user_info from Table1 WHERE userid='1234567'";
40%的请求是:

"SELECT user_info from Table1 WHERE userid='1234567' AND status=0";
"SELECT user_info from Table1 WHERE userid='1234567' AND status=1";
20%的请求是:

"SELECT user_info from Table1 WHERE userid='1234567' AND status=0";
"SELECT user_info from Table1 WHERE userid='1234567' AND status=1";
或者,有更好的方法来提高性能,我应该考虑以某种方式对状态列进行索引

如果不是30%、40%、20%,而是实际变为9%、90%、1%,即大多数请求的状态为0,我是否应该更改某些内容? 谢谢。

状态索引不太可能提高SELECT性能,因为列内容不够多样化。基于userid的索引很可能会大大提高性能,因为列内容非常多样化

当您将userid列定义为unique时,应该已经在查询中使用自动创建的unique索引。因此无需定义额外的索引。

由于列内容不够多样化,状态索引不太可能提高SELECT性能。基于userid的索引很可能会大大提高性能,因为列内容非常多样化


当您将userid列定义为unique时,应该已经在查询中使用自动创建的unique索引。因此,无需定义额外的索引。

我建议删除id列合成键-它用于什么?。然后,首先对用户id进行累计PK,然后对状态进行累计PK


更好的解决方案-从PK中删除状态,并始终仅按用户id选择。检查应用程序中的状态并抛出404或任何东西。

我建议删除id列合成键-它用于什么?。然后,首先对用户id进行累计PK,然后对状态进行累计PK


更好的解决方案-从PK中删除状态,并始终仅按用户id选择。检查应用程序中的状态并抛出404或其他任何内容。

类似userid的表名意味着列是用户表id字段的外键。如果将其定义为InnoDB表上的外键,则会自动为其编制索引。关于索引fk的好信息:像userid这样的表名意味着列是用户表id字段的外键。如果将其定义为InnoDB表上的外键,则会自动为其编制索引。有关索引fk的详细信息: