MySQL在运营商备选方案中的应用

MySQL在运营商备选方案中的应用,mysql,Mysql,在我的查询中,我必须找到下面id以逗号分隔的所有记录 2,20,44,66,68,85,90,101,102,103,125,168 因此,我为该任务编写了以下查询 SELECT item_id, item_name FROM `items` WHERE `item_id` IN ( 2, 20, 44, 66, 68, 85, 90, 101, 102, 103, 125,

在我的查询中,我必须找到下面id以逗号分隔的所有记录

2,20,44,66,68,85,90,101,102,103,125,168
因此,我为该任务编写了以下查询

SELECT item_id, 
       item_name 
FROM   `items` 
WHERE  `item_id` IN ( 2, 20, 44, 66, 
                      68, 85, 90, 101, 
                      102, 103, 125, 168 ) 
但问题是,当逗号分隔的ID列表很大时,查询执行时间会变长。有没有其他方法来完成我的任务

下面是描述表查询后我的表结构。请查收

Field   Type    Null    Key Default Extra   
asheet_id   int(11) unsigned    NO  PRI NULL    auto_increment
asheet_staff_id int(11) unsigned    NO      NULL    
asheet_exam_number  int(11) NO      NULL    

项目id
是主键吗

执行:

DESCRIBE items;
并对结果提出质疑

1) 如果
YES
,则调查服务器的内存、查询缓存、查询并发性、网络/套接字连接等因素。也许慢的部分不是你的查询,而是你应用程序的另一部分?因此,请在问题/评论中描述您是如何检查的。 看看
my.cnf
有许多参数可以帮助您调整mysql性能

2) 如果
NO
so添加索引:
ALTER TABLE items添加索引项\u id\u索引(item\u id)

如果:您的
项目
表不能经常
更新
查询,最好将引擎更改为
MyISAM
,选择
查询

我还要说,让我们试试以下技巧:

1)
联合选择
每个id,因为如果是PK,它将作为
选择。。。限制1

SELECT item_id, item_name FROM  items WHERE item_id = 2
UNION ALL
SELECT item_id, item_name FROM  items WHERE item_id = 20
UNION ALL
.
.
UNION ALL
SELECT item_id, item_name FROM  items WHERE item_id = 168
2) 创建视图并向其发送查询:

CREATE OR REPLACE VIEW vw_items AS 
SELECT item_id, item_name FROM items;

SELECT * FROM vw_items WHERE item_id IN (...);
此外,如果数据库有许多请求,并且如果
表有更新查询,请尝试使用
memcache
redis
将查询缓存到数据库


p、 s.执行
加入
子查询
操作不会获得性能,因为在这两种情况下,它将在
项目id
字段上使用相同的索引。

项目id
是主键吗

执行:

DESCRIBE items;
并对结果提出质疑

1) 如果
YES
,则调查服务器的内存、查询缓存、查询并发性、网络/套接字连接等因素。也许慢的部分不是你的查询,而是你应用程序的另一部分?因此,请在问题/评论中描述您是如何检查的。 看看
my.cnf
有许多参数可以帮助您调整mysql性能

2) 如果
NO
so添加索引:
ALTER TABLE items添加索引项\u id\u索引(item\u id)

如果:您的
项目
表不能经常
更新
查询,最好将引擎更改为
MyISAM
,选择
查询

我还要说,让我们试试以下技巧:

1)
联合选择
每个id,因为如果是PK,它将作为
选择。。。限制1

SELECT item_id, item_name FROM  items WHERE item_id = 2
UNION ALL
SELECT item_id, item_name FROM  items WHERE item_id = 20
UNION ALL
.
.
UNION ALL
SELECT item_id, item_name FROM  items WHERE item_id = 168
2) 创建视图并向其发送查询:

CREATE OR REPLACE VIEW vw_items AS 
SELECT item_id, item_name FROM items;

SELECT * FROM vw_items WHERE item_id IN (...);
此外,如果数据库有许多请求,并且如果
表有更新查询,请尝试使用
memcache
redis
将查询缓存到数据库


p、 s.执行
联接
子查询
操作不会获得性能,因为在这两种情况下,它将在
项目id
字段上使用相同的索引。

另一种方法是创建一个
临时表
,用这些数据填充该表,然后执行类似的
联接

create temporary table test(Id int);

insert into test
select 2
union
select 99 from dual;
然后执行与该表的联接

SELECT i.item_id, i.item_name 
FROM  `items` i
JOIN test t ON i.item_id = t.Id;
这种方法比在
列表中有一个巨大的
要好,因为列表中的
会在内部变平为链式
状态,而且,每个RDBMS在
中对
中的元素数量有限制(不确定
MySQL
但是说
NETEZZA
有5000个元素左右的限制)


相反,执行
JOIN
将生成更高效的执行计划。如果
SQL Server
,那么您也可以选择使用
表类型变量

另一种方法是创建一个
临时表
,用这些数据填充该表,然后执行类似的
联接

create temporary table test(Id int);

insert into test
select 2
union
select 99 from dual;
然后执行与该表的联接

SELECT i.item_id, i.item_name 
FROM  `items` i
JOIN test t ON i.item_id = t.Id;
这种方法比在
列表中有一个巨大的
要好,因为列表中的
会在内部变平为链式
状态,而且,每个RDBMS在
中对
中的元素数量有限制(不确定
MySQL
但是说
NETEZZA
有5000个元素左右的限制)


相反,执行
JOIN
将生成更高效的执行计划。如果
SQL Server
,那么您也可以选择使用
表类型变量

正确的索引将(最有可能)解决问题Item_id是主键如果不是这样:ALTER TABLE
items
addindex item\u id\u INDEX(
item\u id
)我不知道还有更好的方法。在项目id上创建索引以提高性能是项目id是主要的key@Alchemist你能执行吗<编码>描述项目正确的索引将(最有可能)解决问题Item_id是主键吗?-如果不是这样:ALTER TABLE
items
addindex item\u id\u INDEX(
item\u id
)我不知道还有更好的方法。在项目id上创建索引以提高性能是项目id是主要的key@Alchemist你能执行吗<编码>描述项目首先,您必须分析数据与数组的关系(2,20,44,66,68,85,90101102103125168)。是否可以将数组值存储在数据库中,并使用item表对逻辑进行一些修改;你可以使用join操作。@bikramkc别逗我笑。第一:如果是PK,它将以最大的效率工作,并找到需要的东西。第二:执行联接操作将不会获得性能,因为即使在联接中,它也将使用在
item_id
字段上定义的相同索引。首先,您必须分析数据与数组的关系(2,20,44,66,68,85,90101102103125168)。是否可以将数组值存储在数据库中,并使用item表对逻辑进行一些修改;你可以使用连接操作。@bikramkc不要逼我