【问题标题】:mysql compare takes too much timemysql比较需要太多时间
【发布时间】:2011-09-23 08:07:54
【问题描述】:

我正在使用下面列出的 3 个表:

 CREATE TABLE `user` (
  `uid` int(10) NOT NULL AUTO_INCREMENT,
  `kid` int(3) NOT NULL,
  `Email` varchar(255) DEFAULT NULL,
  `del` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`uid`),
  KEY `kid` (`kid`),
  KEY `email` (`Email`)
) ENGINE=MyISA

CREATE TABLE `blacklist_global` (
  `bgid` int(10) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL,
  `kid` int(3) DEFAULT NULL,
  `stmp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`bgid`),
  UNIQUE KEY `email` (`email`),
  KEY `kid` (`kid`)
) ENGINE=MyISAM

CREATE TABLE `verteiler_user` (
  `vuid` int(10) NOT NULL AUTO_INCREMENT,
  `uid` int(3) NOT NULL,
  `vid` int(3) NOT NULL,
  `del` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`vuid`),
  KEY `uid` (`uid`)
) ENGINE=MyISAM

user 中的每个条目也在表verteiler_user 中。现在我想delete来自用户where user.uid = verteiler_user.uid and verteiler_user.vid=XX and user.uid = XXX的每个条目

所以 atm 我从 php 获取所有来自表 user 的条目,全部来自 blacklist_global。 问题是,在黑名单中我可以输入 *@heloooo.de 所以我想删除域 helooo.de 中的每封电子邮件,但它非常非常慢。

只能在mysql 中进行吗?没有php?或任何提示,这样做更快?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    这可能会得到你需要的东西。在将其用于生产数据之前先对其进行测试。

    DELETE FROM user WHERE uid = ? AND uid in (SELECT uid from verteiler_user WHERE vid = ?)

    根据评论编辑:

    DELETE FROM user WHERE uid IN (SELECT uid FROM blacklist_global WHERE email LIKE '%@somedomain.com')

    【讨论】:

    • 问题是我必须检查电子邮件地址,如果 user.email 是 blacklist.email 中的 listet 但在 blacklist.email 中可能是 *@ 之类的通配符,我想从用户中删除所有内容bla.de 所以我想从像 blaa 这样的电子邮件的用户中删除 ..
    • @Roby 我根据您的评论添加了一个示例。
    • 感谢快速重播,但我必须检查 @ 前面的字符是否是 * 然后像 email LIKE '%@somedomain.com 那样做,如果不只是检查完整的电子邮件,你明白我的意思吗?
    • MySQL 中的通配符是 % 而不是 *。所以如果你想写代码来处理 * 你需要在 mysql 中进行查询之前替换它。
    • true 但在我的数据库中有一个像 *@hui.de 这样的条目,我无法在 atm 替换它......所以可以用 mysql 来替换它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多