CakePHP verimsiz veritabanı sorguları: bunlar önlenebilir?

2 Cevap php

Benim tablo yapısı:

boxes (id, boxname)
boxes_items (id, box_id, item_id)

Ben "kutusunu silmek" eylem için SQL günlükleri bakarak ve biraz dehşete edildi.

SELECT COUNT(*) AS count FROM boxes Box WHERE Box.id = 191
SELECT BoxesItem.id FROM boxes_items BoxesItem WHERE BoxesItem.box_id = 191
SELECT COUNT(*) AS count FROM boxes_items BoxesItem WHERE BoxesItem.id = 1685
DELETE FROM boxes_items WHERE boxes_items.id = 1685
SELECT COUNT(*) AS count FROM boxes_items BoxesItem WHERE BoxesItem.id = 1686
DELETE FROM boxes_items WHERE boxes_items.id = 1686

    -- snip 50 more SELECT & DELETE statements --

SELECT COUNT(*) AS count FROM boxes_items BoxesItem WHERE BoxesItem.id = 1733
DELETE FROM boxes_items WHERE boxes_items.id = 1733

DELETE FROM boxes WHERE boxes.id = 191

Bu belki de ben gebe olabilir bu tablolardan silmek için en etkili yoludur. Ben bu ile değiştirilmesi olabilir, ortalama:

DELETE FROM boxes WHERE id = 191
DELETE FROM boxes_items WHERE box_id = 191

Kek bu şekilde yapar herhangi bir neden var mı? Eğer değilse, ben çekirdek kütüphaneleri bozmadan prosedürü düzene herhangi bir şekilde biliyor musunuz?


İşte kod ilgili bit var:

// app/controllers/boxes_controller.php    /////////////

public function delete($id = null) {
    if ($this->Box->del($id)) {
        $this->redirect(array('action'=>'index'));
    }
}

// app/models/box.php    ///////////////////////////////

class Boxes extends AppModel {
    var $hasAndBelongsToMany = array(
        'Item'
    );
}

// app/models/app_model.php    /////////////////////////

class AppModel {
    var $actsAs = array('Containable');
    var $recursive = -1;
}

2 Cevap

Eğer I am varsayarak bir hasMany ilişki, durum varsa "özel" bayrak ayarı denemek isteyebilirsiniz:

http://book.cakephp.org/view/82/hasMany

exclusive: When exclusive is set to true, recursive model deletion does the delete with a deleteAll() call, instead of deleting each entity separately. This greatly improves performance, but may not be ideal for all circumstances.

Ne yazık ki Kek nasıl yapar bulunuyor.

Bu kaba mockup gibi bir şey ile model del() yöntemini geçersiz olabilir:

function del($id, $cascade = true) {
    if ($cascade) {
        $this->BoxesItem->deleteAll(array('BoxesItem.box_id' => $id));
    }
    return parent::del($id, false);
}