0

我正在制作一个客户表,我需要索引中的 4 个字段。这是表结构。

id、userName、status、email、password、fullName、joinDate(id 是 autoIncrement 和主键)

Index 中的 4 个字段是:用户名、状态、电子邮件、密码

我需要运行的查询是:

select id from table where status='active' and email='emailId' and password='pass' limit 1

select id from table where userName='user' and status='active' limit 1

select fullName from table where id='123' limit 1

我想知道所有这些查询是否都会遵循索引?如果不是,我该如何更改结构以便遵循索引?我正在使用mysql和php。

谢谢

4

2 回答 2

0

我有根据的猜测是“否”、“是”和“否”,依次是“否”、“是”和“否”。但是,如果您有可以回答问题和衡量性能的工具,那么猜测是愚蠢的。

如何更改结构以便遵循索引?

这完全是倒退。数据库结构本质上是您的公共 API。不要改变结构;更改索引。

以下是您的查询和可能运行良好的索引。(您不仅限于单个索引。但不要相信“可能工作良好”;用 EXPLAIN 衡量。)

select id 
from table 
where status='active' 
  and email='emailId' 
  and password='pass' limit 1;

create index on table (status, email, password);

这个查询(上面)可能不会使用现有的索引,因为第一列——用户名——没有在 WHERE 子句中使用。

select id 
from table 
where userName='user' 
  and status='active' limit 1;

只要您按实际顺序列出了索引中的列,就应该为此查询使用现有索引。(WHERE 子句中的两列与索引中的前两列相匹配。)使用 EXPLAIN 进行验证。

select fullName 
from table 
where id='123' limit 1;

“id”列是主键;它已经有一个索引。

看起来您只是“需要”在 {status, email, password} 上添加索引。

MySQL 多列索引

于 2013-06-19T00:13:13.733 回答
0

是的,您的索引很好。我喜欢使用 php 来验证一些字段,因为它只是一个字段查询。但是您应该考虑将状态更改为数字 tinyint(1) 或 char(1) 并使用 1 = 活动,2 = 不活动,3=禁用,4=禁止

select id,status,password from table where email='emailId' limit 1

$db_rows = mysql_num_rows($result); // $db->num_rows;

if($row['status']=='active' &&  $row['password']==$pass && $db_rows==1){do stuff}

select id,status from table where userName='user' limit 1

if($row['status']=='active' && $db_rows==1){do stuff}

select fullName from table where id='123' limit 1
于 2013-06-19T00:24:56.813 回答