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

Kueri MySQL cepat ketika dijalankan secara langsung tetapi sangat lambat ketika dijalankan sebagai proc

Saya memiliki masalah yang sama. Setelah meneliti sebentar, saya menemukan masalahnya adalah masalah collation saat MySQL sedang membandingkan teks.

TL;DR: tabel dibuat dalam satu susunan sementara MySQL "berpikir" variabel berada di susunan lain. Oleh karena itu, MySQL tidak dapat menggunakan indeks yang ditujukan untuk kueri.

Dalam kasus saya, tabel dibuat dengan (latin1 , latin1_swedish_ci ) penyusunan. Untuk membuat MySQL menggunakan indeks, saya harus mengubah where klausa dalam prosedur tersimpan dari

    UPDATE ... WHERE mycolumn = myvariable

untuk

    UPDATE ... WHERE mycolumn = 
        convert(myvariable using latin1) collate latin1_swedish_ci

Setelah perubahan, prosedur tersimpan tampak seperti ini:

    CREATE PROCEDURE foo.'bar'()
    BEGIN
        UPDATE mytable SET mycolumn1 = variable1
        WHERE mycolumn2 = 
            convert(variable2 using latin1) collate latin1_swedish_ci
    END;

di mana (latin1 , latin1_swedish_ci ) adalah susunan yang sama dengan tableA my saya dibuat dengan.

Untuk memeriksa apakah MySQL menggunakan indeks atau tidak, Anda dapat mengubah prosedur tersimpan untuk menjalankan explain pernyataan sebagai berikut:

    CREATE PROCEDURE foo.'bar'()
    BEGIN
        EXPLAIN SELECT * FROM table WHERE mycolumn2 = variable2
    END;

Dalam kasus saya, explain hasil menunjukkan bahwa tidak ada indeks yang digunakan selama eksekusi kueri.

Perhatikan bahwa MySQL dapat menggunakan indeks saat Anda menjalankan kueri sendirian, tetapi tetap tidak akan menggunakan indeks untuk kueri yang sama di dalam prosedur tersimpan, yang mungkin karena entah bagaimana MySQL melihat variabel dalam susunan lain.

Informasi lebih lanjut tentang masalah susunan dapat ditemukan di sini:http://lowleveldesign.wordpress.com/2013/07/19/diagnosing-collation-issue-mysql-stored-procedure/ Tautan cadangan:http ://www.codeproject.com/Articles/623272/Diagnosing-a-collation-issue-in-a-MySQL-stored-pro



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolom ambigu dalam pernyataan INNER JOIN

  2. Cari tabel mysqli dengan formulir dan hasil tampilan

  3. Git bash di windows 7. perintah mysqldump tidak berfungsi

  4. kunci utama komposit (alfanumerik) dan peningkatan otomatis

  5. SQL Query untuk mendapatkan nilai kolom yang sesuai dengan nilai MAX kolom lain?