ฉันใช้ Laravel 4.2 และแอปพลิเคชันของฉันใช้สำหรับติดตามสินค้าคงคลังในหลาย ๆ ที่
ฐานข้อมูลได้รับการตั้งค่าด้วยตาราง inventory_items
ตาราง inventory_locations
และตารางสรุปข้อมูลระหว่างตาราง inventory_items_inventory_location
ซึ่งมีค่าปริมาณในขณะที่อ้างอิงทั้งรายการสินค้าคงคลังและตำแหน่งที่มีบันทึกอยู่
ข้อความค้นหาของฉันคือการค้นหารายการสินค้าคงคลังที่มีค่าปริมาณสถานที่มากกว่าหรือเท่ากับ 0 ใน Laravel ฉันใช้แบบสอบถามย่อยและหรือโดยที่เป็นเช่นนั้น:
InventoryItem::whereHas('inventoryLocations', function($q) {
$q->where('reserved', '>=', 0)
->orWhere('available', '>=', 0) # slow
->orWhere('inbound', '>=', 0) # slow
->orWhere('total', '>=', 0); # slow
})->toSql();
ซึ่งให้ SQL ต่อไปนี้:
select * from `inventory_items`
where `inventory_items`.`deleted_at` is null
and (
select count(*) from `inventory_locations`
inner join `inventory_item_inventory_location`
on `inventory_locations`.`id` = `inventory_item_inventory_location`.`inventory_location_id`
where `inventory_item_inventory_location`.`inventory_item_id` = `inventory_items`.`id`
and `reserved` >= ?
or `available` >= ? # slow
or `inbound` >= ? # slow
or `total` >= ? # slow
) >= 1
ปัญหาคือด้วยคำสั่ง or
(ทำเครื่องหมายในโค้ดด้วย #slow
) เวลาในการสืบค้นสูงถึง 1 วินาทีโดยตรงกับ Sequel Pro มากกว่า 5 วินาทีผ่านแอป Laravel ของฉัน (หรือผ่านช่างซ่อม) หากไม่มีการตรวจสอบ 'หรือ' เหล่านี้ (เช่น เพียงตรวจสอบประเภทปริมาณหนึ่งประเภท เช่น 'สงวนไว้') ข้อความค้นหาจะอยู่ที่ ‹100ms บน Sequel Pro และคล้ายกันในแอป/คนจรจัด
ฉันไม่แน่ใจว่าเหตุใดการเพิ่มเช็ค 'หรือ' พิเศษเหล่านี้จึงเพิ่มเวลาให้กับการค้นหามาก มีแนวคิดใดบ้างที่จะสร้างแบบสอบถามที่มีประสิทธิภาพมากขึ้น
reserved
,available
,inbound
,total
ของตารางแล้วหรือยัง? - person num8er   schedule 30.12.2016available
,inbound
และtotal
ของคุณได้ - person Rwd   schedule 30.12.2016>=
เป็น>
เพราะฉันไม่เห็นตรรกะของwhereHas('inventoryLocations')
ฉันหมายถึงคุณต้องตรวจสอบการมีอยู่ของinventoryLocations
หากข้อมูลมีค่ามากกว่าศูนย์ เพราะ>=
อาจส่งคืนข้อมูลทั้งหมด - person num8er   schedule 30.12.2016=, >, <
เป็นต้น - person Mr Office   schedule 30.12.2016