MySQL在运营商备选方案中的应用
在我的查询中,我必须找到下面id以逗号分隔的所有记录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,
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 TABLEitems
addindex item\u id\u INDEX(item\u id
)我不知道还有更好的方法。在项目id上创建索引以提高性能是项目id是主要的key@Alchemist你能执行吗<编码>描述项目代码>正确的索引将(最有可能)解决问题Item_id是主键吗?-如果不是这样:ALTER TABLEitems
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不要逼我