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