Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Prosedur tersimpan MySQL menyebabkan masalah?

Hanya sedikit yang dapat Anda lakukan dengan kueri ini.

Coba ini:

  1. Buat PRIMARY KEY pada categoryIds (categoryId)

    • Pastikan supplier (supplied_id) adalah PRIMARY KEY

    • Pastikan bahwa category_product (ProductID, CategoryID) (dalam urutan ini) adalah PRIMARY KEY , atau Anda memiliki indeks dengan ProductID 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mengapa sql dengan 'ada' berjalan lebih lambat daripada 'dalam' menggunakan MySQL

  2. Tidak dapat terhubung ke Server MySQL jarak jauh

  3. Manajemen akun pengguna, peran, izin, otentikasi PHP dan MySQL - Bagian 6

  4. Menjumlahkan kolom yang dipisahkan koma di MySQL 4 (bukan 5)

  5. Cara membuat server di Azure dan Host php, situs mysql di atasnya