Jadual Kandungan
Latar Belakang
Log kebuntuan
Struktur jadual
Pelan pelaksanaan
Mengapa index_merge digunakan?
Penyelesaian
1 Dari peringkat kod
Rumah pangkalan data tutorial mysql Bagaimana untuk menyelesaikan kebuntuan yang disebabkan oleh gabungan indeks pengoptimuman MySQL

Bagaimana untuk menyelesaikan kebuntuan yang disebabkan oleh gabungan indeks pengoptimuman MySQL

May 27, 2023 pm 05:49 PM
mysql merge index

Latar Belakang

Kebuntuan berlaku dalam persekitaran pengeluaran Dengan menyemak log kebuntuan, saya melihat kebuntuan itu disebabkan oleh dua kenyataan kemas kini yang sama (hanya nilai dalam keadaan yang berbeza),

adalah seperti berikut:

UPDATE test_table SET `status` = 1 WHERE `trans_id` = 'xxx1' AND `status` = 0;
UPDATE test_table SET `status` = 1 WHERE `trans_id` = 'xxx2' AND `status` = 0;
Salin selepas log masuk

Sukar untuk difahami pada mulanya Selepas banyak siasatan dan kajian, saya menganalisis prinsip-prinsip khusus pembentukan kebuntuan suka berkongsi dengan semua orang dengan harapan dapat membantu orang yang menghadapi masalah yang sama.

Disebabkan MySQL banyak ilmu, banyak kata nama tidak akan terlalu banyak diperkenalkan di sini Kawan-kawan yang berminat boleh buat susulan dengan kajian mendalam khas.

Log kebuntuan

*** (1) TRANSACTION:
TRANSACTION 791913819, ACTIVE 0 sec starting index read, thread declared inside InnoDB 4999
mysql tables in use 3, locked 3
LOCK WAIT 4 lock struct(s), heap size 1184, 3 row lock(s)
MySQL thread id 462005230, OS thread handle 0x7f55d5da3700, query id 2621313306 x.x.x.x test_user Searching rows for update
UPDATE test_table SET `status` = 1 WHERE `trans_id` = 'xxx1' AND `status` = 0;
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 110 page no 39167 n bits 1056 index `idx_status` of table `test`.`test_table` trx id 791913819 lock_mode X waiting
Record lock, heap no 495 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

*** (2) TRANSACTION:
TRANSACTION 791913818, ACTIVE 0 sec starting index read, thread declared inside InnoDB 4999
mysql tables in use 3, locked 3
5 lock struct(s), heap size 1184, 4 row lock(s)
MySQL thread id 462005231, OS thread handle 0x7f55cee63700, query id 2621313305 x.x.x.x test_user Searching rows for update
UPDATE test_table SET `status` = 1 WHERE `trans_id` = 'xxx2' AND `status` = 0;
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 110 page no 39167 n bits 1056 index `idx_status` of table `test`.`test_table` trx id 791913818 lock_mode X
Record lock, heap no 495 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 110 page no 41569 n bits 88 index `PRIMARY` of table `test`.`test_table` trx id 791913818 lock_mode X locks rec but not gap waiting
Record lock, heap no 14 PHYSICAL RECORD: n_fields 30; compact format; info bits 0

*** WE ROLL BACK TRANSACTION (1)
Salin selepas log masuk

Analisis ringkas log kebuntuan di atas:

  • 1. Baris 1 hingga 9), baris 6 ialah pernyataan SQL yang dilaksanakan oleh transaksi (1), baris 7 dan 8 bermakna transaksi (1) sedang menunggu kunci X pada indeks idx_status

  • 2. Dalam blok kandungan kedua (baris 11 hingga baris 19), baris 16 ialah pernyataan SQL yang dilaksanakan oleh transaksi (2), dan baris 17 dan 18 bermakna transaksi (2) memegang indeks idx_status Kunci X dihidupkan ;

  • bermaksud: transaksi (2) sedang menunggu untuk memperoleh kunci X pada indeks UTAMA. (tetapi bukan gap bermaksud bukan gap lock)

  • 4. Ayat terakhir bermaksud MySQL melancarkan transaksi (1).

Struktur jadual

CREATE TABLE `test_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`trans_id` varchar(21) NOT NULL,
`status` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_trans_id` (`trans_id`) USING BTREE,
KEY `idx_status` (`status`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
Salin selepas log masuk

Seperti yang dapat dilihat daripada struktur jadual, terdapat indeks unik trans_id pada lajur uniq_trans_id , dan terdapat normal indeks pada lajur status idx_status, lajur id ialah indeks kunci utama PRIMARY .

Terdapat dua jenis indeks dalam enjin InnoDB:

  • Indeks berkelompok: Letakkan storan data dan indeks bersama , nod daun struktur indeks menyimpan data baris.

  • Indeks tambahan: Nod daun indeks tambahan menyimpan nilai kunci utama, iaitu nilai kunci indeks berkelompok.

Indeks kunci utama PRIMARY ialah indeks berkelompok dan data baris akan disimpan dalam nod daun. Indeks uniq_trans_id dan idx_status ialah indeks tambahan dan nod daun menyimpan nilai kunci utama, iaitu nilai lajur id.

Apabila kami mencari data baris melalui indeks tambahan, kami mula-mula mencari id kunci utama melalui indeks tambahan, kemudian melakukan carian kedua melalui indeks kunci primer (juga dipanggil kembali ke jadual), dan akhirnya cari data baris.

Pelan pelaksanaan

Bagaimana untuk menyelesaikan kebuntuan yang disebabkan oleh gabungan indeks pengoptimuman MySQL

Dengan melihat pelan pelaksanaan, anda boleh mendapati bahawa pernyataan kemas kini menggunakan penggabungan indeks, iaitu, pernyataan ini menggunakan kedua-dua uniq_trans_id indeks , dan indeks idx_status digunakan Using intersect(uniq_trans_id,idx_status) bermaksud untuk mendapatkan persimpangan melalui dua indeks.

Mengapa index_merge digunakan?

Sebelum MySQL 5.0, jadual hanya boleh menggunakan satu indeks pada satu masa dan tidak boleh menggunakan berbilang indeks pada masa yang sama untuk imbasan bersyarat. Tetapi bermula dari 5.1, teknologi pengoptimuman index merge telah diperkenalkan dan berbilang indeks boleh digunakan untuk melakukan imbasan bersyarat pada jadual yang sama.

Sebagai contoh, pernyataan dalam pelan pelaksanaan:

UPDATE test_table SET `status` = 1 WHERE `trans_id` = '38' AND `status` = 0 ;
Salin selepas log masuk

MySQL akan menggunakan indeks trans_id = ‘38’ untuk mencari nilai id yang disimpan dalam nod daun berdasarkan Keadaan uniq_trans_id; pada masa yang sama Berdasarkan keadaan status = 0, indeks idx_status akan digunakan untuk mencari nilai id yang disimpan dalam nod daun, kemudian kedua-dua nilai id yang ditemui akan bersilang, dan akhirnya id persimpangan akan dikembalikan ke jadual, iaitu, nod daun akan ditemui melalui data Baris indeks UTAMA yang disimpan dalam .

Ramai orang mungkin mempunyai soalan di sini uniq_trans_id sudah menjadi indeks unik Hanya satu keping data boleh didapati paling banyak melalui indeks ini. Kemudian mengapa pengoptimum MySQL menggunakan dua indeks untuk mendapatkan persimpangan. , dan kemudian kembali ke jadual untuk membuat pertanyaan. Bukankah ini menambahkan proses carian indeks idx_status lagi? Mari analisa proses pelaksanaan kedua-dua situasi ini.

Yang pertama hanya menggunakan indeks uniq_trans_id:

  • Menurut syarat pertanyaan trans_id = ‘38’, gunakan indeks uniq_trans_id untuk mencari data yang disimpan dalam nilai id nod daun;

  • Gunakan indeks PRIMER untuk mencari data baris yang disimpan dalam nod daun melalui nilai id yang ditemui;

    dan kemudian lulus
  • Syarat menapis data baris yang ditemui.
  • status = 0

    Jenis kedua menggunakan penggabungan indeks
  • :

Using intersect(uniq_trans_id,idx_status)

Mengikut syarat pertanyaan
    , gunakan indeks
  • untuk cari nod daun Nilai id yang disimpan dalam nod daun;

  • Silangkan nilai id yang terdapat dalam 1/2, dan kemudian gunakan indeks UTAMA untuk mencari data baris yang disimpan dalam nod daun

Dalam kedua-dua kes di atas, Perbezaan utama ialah kaedah pertama adalah untuk mencari data melalui indeks terlebih dahulu, dan kemudian menggunakan syarat pertanyaan lain untuk menapis kaedah kedua adalah untuk mendapatkan persilangan nilai id pertama yang ditemui melalui dua indeks Jika masih terdapat nilai id selepas persimpangan, , kemudian kembali ke jadual untuk mendapatkan semula data.

Apabila pengoptimum percaya bahawa kos pelaksanaan kes kedua adalah lebih kecil daripada kes pertama, penggabungan indeks akan berlaku. (Terdapat sedikit data dalam jadual aliran persekitaran pengeluaran status = 0, yang merupakan salah satu sebab mengapa pengoptimum mempertimbangkan kes kedua).

Mengapa ia buntu selepas menggunakan index_merge

Bagaimana untuk menyelesaikan kebuntuan yang disebabkan oleh gabungan indeks pengoptimuman MySQL

Di atas secara ringkas menggambarkan proses penguncian dua transaksi kemas kini, seperti yang dapat dilihat dari rajah Ternyata terdapat bahagian yang bertindih dan bersilang pada kedua-dua indeks idx_status dan PRIMER (indeks berkelompok), yang mewujudkan keadaan untuk kebuntuan.

Sebagai contoh, kebuntuan akan berlaku apabila pemasaan berikut ditemui:

Bagaimana untuk menyelesaikan kebuntuan yang disebabkan oleh gabungan indeks pengoptimuman MySQL

Transaksi 1 menunggu transaksi 2 untuk melepaskan kunci, Transaksi 2 menunggu transaksi 1 melepaskan kunci, sekali gus menyebabkan kebuntuan.

Selepas MySQL mengesan kebuntuan, ia akan melancarkan semula transaksi secara automatik dengan kos yang lebih rendah Contohnya, dalam rajah masa di atas, jika transaksi 1 memegang lebih sedikit kunci daripada transaksi 2, maka MySQL akan melancarkan transaksi 1. .

Penyelesaian

1 Dari peringkat kod

  • Dalam keadaan pertanyaan di mana, hanya luluskan trans_id selepas menanyakan data, dalam kod Tentukan sama ada status adalah 0 pada tahap

  • menggunakan force index(uniq_trans_id) untuk memaksa pernyataan pertanyaan menggunakan indeks uniq_trans_id

  • di mana terus selepas syarat pertanyaan Gunakan medan id untuk mengemas kini melalui kunci utama.

2 Dari peringkat MySQL

  • padamkan indeks

    atau buat indeks bersama yang mengandungi dua lajur ini; 🎜 >idx_status

    Matikan
  • pengoptimuman pengoptimuman MySQL.
  • index merge

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan kebuntuan yang disebabkan oleh gabungan indeks pengoptimuman MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara membuka phpmyadmin Cara membuka phpmyadmin Apr 10, 2025 pm 10:51 PM

Anda boleh membuka phpmyadmin melalui langkah -langkah berikut: 1. Log masuk ke panel kawalan laman web; 2. Cari dan klik ikon phpmyadmin; 3. Masukkan kelayakan MySQL; 4. Klik "Login".

MySQL: Pengenalan kepada pangkalan data paling popular di dunia MySQL: Pengenalan kepada pangkalan data paling popular di dunia Apr 12, 2025 am 12:18 AM

MySQL adalah sistem pengurusan pangkalan data relasi sumber terbuka, terutamanya digunakan untuk menyimpan dan mengambil data dengan cepat dan boleh dipercayai. Prinsip kerjanya termasuk permintaan pelanggan, resolusi pertanyaan, pelaksanaan pertanyaan dan hasil pulangan. Contoh penggunaan termasuk membuat jadual, memasukkan dan menanyakan data, dan ciri -ciri canggih seperti Operasi Join. Kesalahan umum melibatkan sintaks SQL, jenis data, dan keizinan, dan cadangan pengoptimuman termasuk penggunaan indeks, pertanyaan yang dioptimumkan, dan pembahagian jadual.

Cara menggunakan redis berulir tunggal Cara menggunakan redis berulir tunggal Apr 10, 2025 pm 07:12 PM

Redis menggunakan satu seni bina berulir untuk memberikan prestasi tinggi, kesederhanaan, dan konsistensi. Ia menggunakan I/O multiplexing, gelung acara, I/O yang tidak menyekat, dan memori bersama untuk meningkatkan keserasian, tetapi dengan batasan batasan konkurensi, satu titik kegagalan, dan tidak sesuai untuk beban kerja yang berintensifkan.

Tempat Mysql: Pangkalan Data dan Pengaturcaraan Tempat Mysql: Pangkalan Data dan Pengaturcaraan Apr 13, 2025 am 12:18 AM

Kedudukan MySQL dalam pangkalan data dan pengaturcaraan sangat penting. Ia adalah sistem pengurusan pangkalan data sumber terbuka yang digunakan secara meluas dalam pelbagai senario aplikasi. 1) MySQL menyediakan fungsi penyimpanan data, organisasi dan pengambilan data yang cekap, sistem sokongan web, mudah alih dan perusahaan. 2) Ia menggunakan seni bina pelanggan-pelayan, menyokong pelbagai enjin penyimpanan dan pengoptimuman indeks. 3) Penggunaan asas termasuk membuat jadual dan memasukkan data, dan penggunaan lanjutan melibatkan pelbagai meja dan pertanyaan kompleks. 4) Soalan -soalan yang sering ditanya seperti kesilapan sintaks SQL dan isu -isu prestasi boleh disahpepijat melalui arahan jelas dan log pertanyaan perlahan. 5) Kaedah pengoptimuman prestasi termasuk penggunaan indeks rasional, pertanyaan yang dioptimumkan dan penggunaan cache. Amalan terbaik termasuk menggunakan urus niaga dan preparedStatemen

Mengapa menggunakan mysql? Faedah dan kelebihan Mengapa menggunakan mysql? Faedah dan kelebihan Apr 12, 2025 am 12:17 AM

MySQL dipilih untuk prestasi, kebolehpercayaan, kemudahan penggunaan, dan sokongan komuniti. 1.MYSQL Menyediakan fungsi penyimpanan dan pengambilan data yang cekap, menyokong pelbagai jenis data dan operasi pertanyaan lanjutan. 2. Mengamalkan seni bina pelanggan-pelayan dan enjin penyimpanan berganda untuk menyokong urus niaga dan pengoptimuman pertanyaan. 3. Mudah digunakan, menyokong pelbagai sistem operasi dan bahasa pengaturcaraan. 4. Mempunyai sokongan komuniti yang kuat dan menyediakan sumber dan penyelesaian yang kaya.

Cara menyambung ke pangkalan data Apache Cara menyambung ke pangkalan data Apache Apr 13, 2025 pm 01:03 PM

Apache menyambung ke pangkalan data memerlukan langkah -langkah berikut: Pasang pemacu pangkalan data. Konfigurasikan fail web.xml untuk membuat kolam sambungan. Buat sumber data JDBC dan tentukan tetapan sambungan. Gunakan API JDBC untuk mengakses pangkalan data dari kod Java, termasuk mendapatkan sambungan, membuat kenyataan, parameter mengikat, melaksanakan pertanyaan atau kemas kini, dan hasil pemprosesan.

Pantau titisan redis dengan perkhidmatan pengeksport redis Pantau titisan redis dengan perkhidmatan pengeksport redis Apr 10, 2025 pm 01:36 PM

Pemantauan yang berkesan terhadap pangkalan data REDIS adalah penting untuk mengekalkan prestasi yang optimum, mengenal pasti kemungkinan kesesakan, dan memastikan kebolehpercayaan sistem keseluruhan. Perkhidmatan Pengeksport Redis adalah utiliti yang kuat yang direka untuk memantau pangkalan data REDIS menggunakan Prometheus. Tutorial ini akan membimbing anda melalui persediaan lengkap dan konfigurasi perkhidmatan pengeksport REDIS, memastikan anda membina penyelesaian pemantauan dengan lancar. Dengan mengkaji tutorial ini, anda akan mencapai tetapan pemantauan operasi sepenuhnya

Cara Melihat Ralat Pangkalan Data SQL Cara Melihat Ralat Pangkalan Data SQL Apr 10, 2025 pm 12:09 PM

Kaedah untuk melihat ralat pangkalan data SQL adalah: 1. Lihat mesej ralat secara langsung; 2. Gunakan kesilapan menunjukkan dan menunjukkan perintah amaran; 3. Akses log ralat; 4. Gunakan kod ralat untuk mencari punca kesilapan; 5. Semak sambungan pangkalan data dan sintaks pertanyaan; 6. Gunakan alat debugging.

See all articles