Php mysql选择用于检查条目是否存在

Php mysql选择用于检查条目是否存在,php,mysql,Php,Mysql,我有一个很大的数据库,如果一封邮件在一个特殊的组中,我必须检查它 我不得不坐在桌子上 第一个tabel称为user 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 和一个名为group的表 CREATE

我有一个很大的数据库,如果一封邮件在一个特殊的组中,我必须检查它 我不得不坐在桌子上

第一个tabel称为user

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
和一个名为group的表

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 
每次插入我都有一个明确的视频和一封电子邮件 现在我必须检查,是否有uid用户在组vid中

从用户a、组b中选择a.email、b.vuid,其中a.email=\'.$email.'\'和a.kid='$孩子。“和b.vid=”$维德a.uid=b.uid limit 1')

并检查mysql_fetch_assoc是否为true或false


但这非常缓慢。有没有简单的加速方法?

如果速度慢,则可能是查找列或外键列上缺少索引

如果速度慢,则查找列或外键列上可能缺少索引

不要使用逗号分隔的表列表,而是尝试使用带有
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子句中可以索引的值;任何具有唯一值的都是候选项。

不要使用逗号分隔的表列表,而是尝试使用带有
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子句中可以索引的值;任何具有唯一值的对象都是候选对象。

请执行以下操作:

ALTER TABLE `group` ADD INDEX `uid`(uid);
ALTER TABLE `user` ADD INDEX `email`(`Email`);
这将解决您的速度缓慢问题。

请执行以下操作:

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

这将修复您的速度慢。

任何用作外键的列都应定义为与外键表中的键相同,并具有索引。这样Mysql可以快速处理连接。如果您不这样做,它将不得不使用较慢的表扫描方法来加入表。:-/您能帮助我吗?像ALTER TABLE group ADD FOREIGN KEY(uid)REFERENCES user(uid)??您不需要添加外键约束,只需要添加索引。我必须重新启动数据库吗?因为它更快。。。think Slower任何用作外键的列都应定义为与外键表中的键相同的列,并具有索引。这样Mysql可以快速处理连接。如果您不这样做,它将不得不使用较慢的表扫描方法来加入表。:-/您能帮助我吗?像ALTER TABLE group ADD FOREIGN KEY(uid)REFERENCES user(uid)??您不需要添加外键约束,只需要添加索引。我必须重新启动数据库吗?因为它更快。。。想想慢一点为什么你还要检查电子邮件?为什么你还要检查电子邮件?