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;