sql - 在 MySQL 中使用集合的更快方法

标签 sql mysql optimization performance set

我有一个 MySQL 5.1 InnoDB 表(customers),其结构如下:

int         record_id (PRIMARY KEY)
int         user_id (ALLOW NULL)
varchar[11] postcode (ALLOW NULL)
varchar[30] region (ALLOW NULL)
..
..
..

表中大约有 700 万行。目前,正在查询该表:

SELECT * FROM customers WHERE user_id IN (32343, 45676, 12345, 98765, 66010, ...

在实际查询中,目前有超过560个user_idIN子句中。表中有几百万条记录,此查询很慢!

表上有二级索引,第一个是 user_id 本身,我认为这会有所帮助。

我知道 SELECT(*) 是一件坏事,这将扩展到所需字段的完整列表。但是,上面没有列出的字段更多的是intdouble。还有另外 50 人被退回,但报告需要他们

我想有更好的方法来访问 user_id 的数据,但我想不出该怎么做。我最初的 react 是删除 user_id 字段上的 ALLOW NULL,据我所知,NULL 处理会减慢查询速度?

如果您能指出比使用 IN ( ) 方法更有效的方向,我将不胜感激。

编辑 Ran EXPLAIN,它说:

select_type = SIMPLE 
table = customers 
type = range 
possible_keys = userid_idx 
key = userid_idx 
key_len = 5 
ref = (NULL) 
rows = 637640 
Extra = Using where 

这有帮助吗?

最佳答案

首先,检查 USER_ID 上是否有索引并确保它已被使用

您可以通过运行 EXPLAIN 来完成。

其次,创建一个临时表并在 JOIN 中使用它:

CREATE TABLE temptable (user_id INT NOT NULL)

SELECT  *
FROM    temptable t
JOIN    customers c
ON      c.user_id = t.user_id

第三,您的查询返回多少行?

如果它返回几乎所有行,那么它只会很慢,因为它必须在连接 channel 上传输所有这些数百万行,一开始。

NULL 不会减慢您的查询速度,因为 IN 条件仅满足索引的非 NULL 值。

更新:

使用了索引,计划很好,只是它返回了超过 50 万行。

您真的需要将所有这些 638,000 行都放入报告中吗?

希望它没有被打印出来:对热带雨林、全局变暖等不利。

严肃地说,您的查询似乎需要聚合或分页。

关于sql - 在 MySQL 中使用集合的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/907323/

相关文章:

php - 每个关键字 10 条记录 SQL

sql - SQL Server中如何合并不同的行?

c - LLVM、CLang 和 LLC 优化通过

sql - 有没有办法在 SQL 中按日期的一部分进行选择?

sql - MySQL select、between、AND、OR子句及查询问题

php - NULL MySQL 到 PHP PDO

mysql - 优化MySQL查询,选择内选择,多个相同

java - 快速 vector 差异/相似性度量

mysql - Xampp 启动时自动启动(Apache、mysql 和 FTP)(OSX)

mysql - 针对货币格式化 SQL 语句