Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL选择按性能排序的连接位置_Php_Mysql - Fatal编程技术网

Php MySQL选择按性能排序的连接位置

Php MySQL选择按性能排序的连接位置,php,mysql,Php,Mysql,我有两个表,它们在不断增长,查询的速度也在缓慢增长,而查询的速度总是很好,不再那么快了 我有两张桌子: # Accounts table CREATE TABLE `account` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `firstname` varchar(50) DEFAULT NULL, `lastname` varchar(50) DEFAULT NULL, `email` varchar(100) DEFAU

我有两个表,它们在不断增长,查询的速度也在缓慢增长,而查询的速度总是很好,不再那么快了

我有两张桌子:

# Accounts table
CREATE TABLE `account` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `firstname` varchar(50) DEFAULT NULL,
  `lastname` varchar(50) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# Orders table
CREATE TABLE `order` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `account_id` int(11) DEFAULT NULL,
  `datetime` datetime DEFAULT NULL,
  `ip` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `account_id` (`account_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
请参阅相关数据

有问题的查询

SELECT 
    o.id,
    a.email
FROM `order` o
JOIN account a ON o.account_id = a.id
WHERE a.email LIKE '%@hotmail.com%'
ORDER BY o.id DESC
LIMIT 2
这个查询运行得很快,只有几条记录。但是使用
EXPLAIN
功能可以搜索account表中的所有记录,而不是有限的
2

按o.id DESC排序
将在较大的表中引起问题。我怎样才能用最好的方法解决这个问题

  • 将查询拆分为两个查询。首先获取所有匹配的帐户,然后通过
    查询
    订单
    ,其中o.account\u id按o.id DESC在(1,3,5)订单中
  • 使用子查询(不知道如何使用)
  • 其他选择
  • 我愿意听取关于如何在更大的数据集中处理此类查询的建议


    注意:我知道这个问题被问了好几次,但这些问题都没有我可以使用的答案。

    我认为你可以用这样的方法“欺骗”MySQL延迟查找(未经测试):

    这个怎么样:

    SELECT 
    o.id,
    a.email
    FROM `order` o
    JOIN (SELECT id, email 
    FROM account 
    WHERE email LIKE '%@hotmail.com%') a ON o.account_id = a.id
    ORDER BY o.id DESC;
    

    慢速位是“%…”,它(与“…%”不同)不能使用索引。是否将域存储在单独的列中?@草莓,在我的数据库上,使用“%”之类的
    运行此查询,而不使用
    ORDER BY
    运行53毫秒。通过
    添加
    订单将其缩短到8秒。因此,真正的痛苦似乎在于订购,而不是类似的东西。在本例中,我使用域作为示例,但我希望能够搜索电子邮件地址的任何部分。@RWC这与此无关。'%…'无法使用索引。@Timo002不清楚您想做什么。您是在尝试搜索域还是子字符串?如果您只需要搜索域,请为域创建另一个字段并为其编制索引。这不会更快。子查询仍然具有影响性能的
    order by
    SELECT 
    o.id,
    a.email
    FROM `order` o
    JOIN (SELECT id, email 
    FROM account 
    WHERE email LIKE '%@hotmail.com%') a ON o.account_id = a.id
    ORDER BY o.id DESC;