mariadb 连接sql性能注意事项

cbeh67ev  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(141)

所以我有三个表列:

merchant:
-id
-name

store:
-id
-merchantId
-name

transaction
-id
-merchantId
-storeId

我想问一下,在获取商户详细信息方面,哪种性能更好?首先删除交易表上的商户ID,然后使用storeId执行连接查询,然后再连接商户ID,还是不删除商户ID,然后根据交易表上的storeId和商户ID对每个表执行连接查询?
我们假设存储和事务具有大量数据,

rslzwgfq

rslzwgfq1#

在这里,您使用了数据的规范化,并且您有三个表,这是很好的,但是使用更多的规范化意味着在接收数据时会对性能造成影响。因此,您可以在这里使用***分页***。要在MySQL中使用分页,您可以使用LIMITOFFSET关键字。您可以使用以下方法:

SELECT
 merchant.name,
 store.name,
 transaction.storeID
FROM merchant
JOIN store
ON merchant.id = store.merchantId
JOIN transaction
ON transaction.storeId= store.id ORDER by merchant.id asc LIMIT 100;

在这里,您将获得1-100个值。

SELECT
 merchant.name,
 store.name,
 transaction.storeID
FROM merchant
JOIN store
ON merchant.id = store.merchantId
JOIN transaction
ON transaction.storeId= store.id ORDER by merchant.id asc LIMIT 100 OFFSET 20;

在这里,您将获得21-120个值

muk1a3rh

muk1a3rh2#

Transaction表不应包括merchantId列。数据模型不应允许两个对象之间存在多个路径

ipakzgxi

ipakzgxi3#

使用两步流程几乎总是“更糟”:

Query 1:
SELECT id ...  --> into an array
Query 2:
... WHERE id IN (...)   --> using that list of ids

最好是执行某种JOINEXISTS,将它们组合成一个查询,而且速度可能快一倍。
INDEXes对性能至关重要。但是索引应该根据将要执行的查询(尤其是SELECTUPDATEDELETE)来设计。(也就是说,不要简单地“索引每一列”。)
在一个有适当索引的百万行表中查找一行几乎与在一个百行表中查找一行一样快。

相关问题