2013-06-18 46 views
0

我正在做一個客戶表,我需要在指標4個領域。 這是表結構。將指標應遵循的這些查詢

ID,用戶名,狀態,電子郵件,密碼,全名,joinDate (ID是自動增量和主鍵)

在指數的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。

感謝

+0

你說的「跟隨意思指標?如果您想確定排序數據,則需要在查詢中指定排序順序:例如,通過userName asc從列表中選擇*。 – 2013-06-18 23:21:17

+5

很容易找到自己:使用EXPLAIN(http://dev.mysql.com/doc/refman/5.6/en/explain.html) –

+0

按照我的意思是如果索引將用於所有3個查詢。索引是遵循從左到右,並在第一次查詢,我跳過指數(用戶名)的第一列 – jeet

回答

0

我的猜測是「否」,「是」,「否」,按照這個順序。但如果你有tools that answer the question and measure the performance,猜測是愚蠢的。

我怎樣才能改變結構,使索引遵循?

這完全是倒退。數據庫結構本質上就是您的公共API。不要改變結構;更改索引。

以下是您的查詢和可能工作正常的索引。 (你不是侷限於單一的指標,但不信任「可能工作得很好」;與EXPLAIN測量)

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

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

這個查詢(上圖)可能不會使用現有的指數,因爲第一列 - userName - 不在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」列是主鍵;它已經有了一個索引。

看起來你只是「需要」上添加{狀態,電子郵件,密碼}的索引。

MySQL multiple column indexes

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 
+0

謝謝!我喜歡這個想法。保留當前索引和創建用戶名另外單列索引,可以工作,我認爲。 – jeet

相關問題