查询的应用已经改变,但原理是一样的。
4张桌子:
states - 状态列表(状态索引) stores - 商店,以及它们所处的状态(状态,商店的单独索引) store_orders - 将订单与商店联系起来(商店,订单的单独索引) order_statuses - 有订单和状态(订单、状态的单独索引)
我想计算特定状态的每个状态有多少订单。
一个查询:
select os.order_status, count(os.order_status) from stores sto, store_order so, order_statuses os where sto.state = 'PA' and sto.store = so.store and so.order = os.order group by os.order_status
在实际应用中,这里的展示计划估计 I/O 约为 500,000
但如果我这样做:
select os.order_status, count(os.order_status) from states sta, stores sto, store_order so, order_statuses os where sta.state = 'PA' where sto.state = sta.state and sto.store = so.store 等等。 order = os.order group by os.order_status
I/O 估计在 2,000 左右,我更改查询所做的只是将 states 表连接到 stores 表,并在 states 中而不是 store 中指定确切的值。
无论我指定一个显式值,还是用那个显式值加入另一个表,DBM 是否仍然需要对存储进行相同的搜索?
我试图弄清楚为什么估计的 I/O 如此之高。
我不是 DBA,但我会尽可能多地学习,因为我经常遇到这样的事情,而且我永远不知道为什么。