Hanya sedikit yang dapat Anda lakukan dengan kueri ini.
Coba ini:
-
Buat
PRIMARY KEYpadacategoryIds (categoryId)-
Pastikan
supplier (supplied_id)adalahPRIMARY KEY -
Pastikan bahwa
category_product (ProductID, CategoryID)(dalam urutan ini) adalahPRIMARY KEY, atau Anda memiliki indeks denganProductIDterkemuka.
-
Pembaruan:
Jika INSERT yang menyebabkan masalah dan product_search_query dalam MyISAM tabel masalahnya bisa dengan MyISAM penguncian.
MyISAM mengunci seluruh tabel jika memutuskan untuk memasukkan baris ke dalam blok kosong di tengah tabel yang dapat menyebabkan timeout.
Coba gunakan INSERT DELAYED sebagai gantinya:
IF @resultsFound > 0 THEN
INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Ini akan menempatkan catatan ke dalam antrian penyisipan dan segera kembali. Catatan akan ditambahkan nanti secara asinkron.
Perhatikan bahwa Anda mungkin kehilangan informasi jika server mati setelah perintah dikeluarkan tetapi sebelum catatan benar-benar dimasukkan.
Pembaruan:
Karena tabel Anda adalah InnoDB , mungkin ada masalah dengan penguncian tabel. INSERT DELAYED tidak didukung di InnoDB .
Bergantung pada sifat kueri, DML kueri di InnoDB meja dapat menempatkan kunci celah yang akan mengunci sisipan.
Misalnya:
CREATE TABLE t_lock (id INT NOT NULL PRIMARY KEY, val INT NOT NULL) ENGINE=InnoDB;
INSERT
INTO t_lock
VALUES
(1, 1),
(2, 2);
Kueri ini melakukan ref memindai dan menempatkan kunci pada catatan individu:
-- Session 1
START TRANSACTION;
UPDATE t_lock
SET val = 3
WHERE id IN (1, 2)
-- Session 2
START TRANSACTION;
INSERT
INTO t_lock
VALUES (3, 3)
-- Success
Kueri ini, saat melakukan hal yang sama, melakukan range memindai dan menempatkan kunci celah setelah nilai kunci 2 , yang tidak akan membiarkan memasukkan nilai kunci 3 :
-- Session 1
START TRANSACTION;
UPDATE t_lock
SET val = 3
WHERE id BETWEEN 1 AND 2
-- Session 2
START TRANSACTION;
INSERT
INTO t_lock
VALUES (3, 3)
-- Locks