Hanya sedikit yang dapat Anda lakukan dengan kueri ini.
Coba ini:
-
Buat
PRIMARY KEY
padacategoryIds (categoryId)
-
Pastikan
supplier (supplied_id)
adalahPRIMARY KEY
-
Pastikan bahwa
category_product (ProductID, CategoryID)
(dalam urutan ini) adalahPRIMARY KEY
, atau Anda memiliki indeks denganProductID
terkemuka.
-
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