2011-06-10 41 views
1

我有一個大的數據庫,並且如果電子郵件是在一個特殊的組中必須chec 我不得不表格。mysql選擇檢查是否存在條目

第一TABEL被叫用戶

CREATE TABLE user (
    uid int(10) NOT NULL AUTO_INCREMENT, 
    kid int(3) NOT NULL, 
    Email varchar(255) DEFAULT NULL, 
    PRIMARY KEY (uid), 
    KEY kid (kid) 
) ENGINE=MyISAM 

和一張桌子命名組

CREATE TABLE `group` (
    `vuid` int(10) NOT NULL AUTO_INCREMENT, 
    `uid` int(3) NOT NULL, 
    `vid` int(3) NOT NULL, 
    PRIMARY KEY (`vuid`) 
) ENGINE=MyISAM 

,併爲每一個插入我有一個定義的VID和電子郵件 現在我不得不檢查,如果有用戶uid在組vid中。

select a.email,b.vuid from user a, group b where a.email=\''.$email.'\' and a.kid=' . $kid.' and b.vid=' . $vid . ' and a.uid = b.uid limit 1')

,並檢查mysql_fetch_assoc是真還是假。

但這是非常慢的。有沒有簡單的方法來加速?

+0

你爲什麼還要檢查電子郵件? – 2011-06-10 16:10:12

回答

2

而不是使用逗號分隔的表的列表,請嘗試使用JOIN(在這種情況下,INNER JOIN是你最好的選擇,因爲你要檢查,如果兩個表中存在的記錄)與ON條款。我已格式化您的查詢,我的更改以大寫形式顯示,以使它們脫穎而出。

select 
    a.email, 
    b.vuid 
from 
    user a 
    INNER JOIN group b 
     ON a.uid = b.uid 
where 
    a.email=\''.$email.'\' 
    and a.kid=' . $kid.' 
    and b.vid=' . $vid . ' 
limit 1 

接下來,檢查你的索引 - 確保你有b.uid和a.kid上的索引。作爲一般規則,檢查您可以索引的值的where子句;具有獨特價值的東西是候選人。

1

如果速度慢,您可能會在查找列或外鍵列上丟失索引。

+0

所以我不得不編輯一組關鍵用戶名爲user.uid? – Roby 2011-06-10 16:08:10

+0

您用作外鍵的任何列都應該定義爲與外表中的鍵相同並具有索引。這樣Mysql可以快速處理連接。如果你不這樣做,它將不得不使用較慢的表掃描方法來連接表。 – datasage 2011-06-10 16:09:41

+0

: - /你能幫我嗎?像ALTER TABLE組ADD FOREIGN KEY(uid)REFERENCES user(uid)?? – Roby 2011-06-10 16:11:38

1

做:

ALTER TABLE `group` ADD INDEX `uid`(uid); 
ALTER TABLE `user` ADD INDEX `email`(`Email`); 

這應該可以解決您的緩慢。