Dalam mysql, pembayang merujuk kepada "petunjuk pengoptimuman pertanyaan", yang akan menggesa pengoptimum untuk menjana pelan pelaksanaan untuk pengoptimuman dengan cara tertentu, menjadikan pernyataan SQL pengguna lebih fleksibel berdasarkan jadual Peraturan seperti susunan sambungan, kaedah, laluan akses dan selari mempunyai kesan pada pernyataan DML (Bahasa Manipulasi Data).
Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.
Kami boleh menambah ulasan semasa mengendalikan jadual, medan atau indeks untuk meningkatkan kebolehbacaan kod supaya orang lain dapat memahami kod dengan cepat Ini adalah petua untuk orang yang menggunakan pangkalan data yang sama, terdapat satu lagi Petua dipanggil petunjuk, adalah petunjuk kepada pangkalan data.
Apakah pembayang
petunjuk merujuk kepada "petunjuk pengoptimuman pertanyaan", yang akan menggesa pengoptimum untuk mengoptimumkan dengan cara tertentu, membolehkan anda kepada Pernyataan SQL adalah lebih fleksibel, yang akan menjadikan pertanyaan anda lebih cepat, sudah tentu, ia juga mungkin lebih perlahan, semuanya bergantung pada pemahaman anda tentang pengoptimum dan pemahaman anda tentang senario.
Kami tahu bahawa apabila melaksanakan pernyataan SQL, MySQL akan menjana pelan pelaksanaan dan pembayang memberitahu pengoptimum pertanyaan untuk menjana pelan pelaksanaan mengikut cara kami memberitahunya.
Petunjuk boleh bertindak pada pernyataan DML (Bahasa Manipulasi Data) berdasarkan susunan sambungan jadual, kaedah, laluan akses, selari dan peraturan lain adalah seperti berikut:
使用的优化器类型; 基于代价的优化器的优化目标,是all_rows还是first_rows; 表的访问路径,是全表扫描,还是索引扫描,还是直接用rowid; 表之间的连接类型; 表之间的连接顺序; 语句的并行程度;
Petua biasa
Force index FORCE INDEKSSELECT * FROM tbl FORCE INDEX (FIELD1) …
Abaikan indeks ABAIKAN INDEXSELECT * FROM tbl IGNORE INDEX (FIELD1, FIELD2) …
Matikan penimbal pertanyaan SQL_NO_CACHESELECT SQL_NO_CACHE field1, field2 FROM tbl;
Apabila anda perlu menanyakan data masa nyata dan kekerapan tidak tinggi, anda boleh mempertimbangkan untuk menggunakan buffer Off, iaitu MySQL tidak akan mencari dalam buffer tanpa mengira sama ada SQL ini telah dilaksanakan.
Paksa query caching SQL_CACHESELECT SQL_CACHE * FROM tbl;
Fungsi ini adalah bertentangan dengan yang sebelumnya, tetapi ia hanya berfungsi apabila query_cache_type dalam my.ini ditetapkan kepada 2.
Keutamaan operasi HIGH_PRIORITY
HIGH_PRIORITY boleh digunakan dalam memilih dan memasukkan operasi untuk memberitahu MYSQL bahawa operasi ini diutamakan. SELECT HIGH_PRIORITY * FROM tbl;
Kendalian Lagging LOW_PRIORITY
LOW_PRIORITY boleh digunakan dalam operasi sisipan dan kemas kini untuk memberitahu mysql bahawa operasi ini ketinggalan. update LOW_PRIORITY tbl set field1= where field1= …
Sisipan tertunda INSERT DELAYEDINSERT DELAYED INTO tbl set field1= …
bermakna pelanggan menghantar permintaan sisipan data dan MySQL mengembalikan status OK tetapi sebenarnya tidak laksanakannya Sebaliknya, ia disimpan dalam memori dan beratur, dan kemudian dimasukkan apabila mysql mempunyai ruang.
Faedah penting ialah permintaan sisipan daripada berbilang pelanggan dikumpulkan bersama dan ditulis ke dalam satu blok, yang jauh lebih pantas daripada melakukan banyak sisipan secara bebas.
Kelemahannya ialah ID yang ditambah secara automatik tidak dapat dikembalikan, dan apabila sistem ranap, data yang belum sempat dimasukkan MySQL akan hilang.
Pesanan sambungan paksa STRAIGHT_JOINSELECT tbl.FIELD1, tbl2.FIELD2 FROM tbl STRAIGHT_JOIN tbl2 WHERE …
Seperti yang dapat dilihat daripada pernyataan SQL di atas, STRAIGHT_JOIN digunakan untuk memaksa MySQL menyambungkan jadual dalam susunan tbl dan tbl2. Jika anda fikir ia adalah lebih cekap untuk menyambung dalam pesanan anda sendiri daripada pesanan yang disyorkan oleh MySQL, anda boleh menggunakan STRAIGHT_JOIN untuk menentukan susunan sambungan.
Memaksa penggunaan jadual sementara SQL_BUFFER_RESULTSELECT SQL_BUFFER_RESULT * FROM tbl WHERE …
Apabila terdapat banyak data dalam set hasil pertanyaan kami, anda boleh memaksa set keputusan ke dalam jadual sementara melalui pilihan SQL_BUFFER_RESULT, supaya kunci jadual MySQL boleh dikeluarkan dengan cepat (supaya pernyataan SQL lain boleh menanyakan rekod ini), dan ia boleh berkhidmat. pelanggan untuk masa yang lama. Pelanggan menyediakan set rekod yang besar.
Pengelompokan menggunakan jadual sementara SQL_BIG_RESULT dan SQL_SMALL_RESULT SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM tbl GROUP BY FIELD1;
adalah sah untuk penyataan SELECT dan memberitahu MySQL untuk mengoptimumkan cara menggunakan jadual sementara untuk mengisih pertanyaan GROUP BY dan DISTINCT , SQL_SMALL_RESULT Ini bermakna set hasil adalah sangat kecil dan boleh diisih terus dalam jadual sementara dalam ingatan jika tidak, jika ia sangat besar, ia perlu diisih menggunakan jadual sementara pada cakera.
SQL_CALC_FOUND_ROWS
Ia sebenarnya bukan gesaan pengoptimum, dan ia juga tidak menjejaskan rancangan pelaksanaan pengoptimum, tetapi ia akan menyebabkan set hasil dikembalikan oleh mysql untuk memasukkan jumlah bilangan baris yang terjejas oleh ini operasi, yang perlu dipadankan dengan FOUND_ROWS()
Penggunaan gabungan. SQL_CALC_FOUND_ROWS
Memberitahu MySQL untuk merekodkan bilangan baris yang diproses kali ini; FOUND_ROWS()
digunakan untuk mendapatkan semula bilangan baris yang direkodkan, yang boleh digunakan pada senario halaman.
Cara umum untuk menulis halaman adalah: mula-mula semak jumlah nombor, kira bilangan halaman, dan kemudian semak butiran halaman tertentu. SELECT COUNT(*) from tbl WHERE …
SELECT * FROM tbl WHERE … limit m,n
Tetapi dengan bantuan SQL_CALC_FOUND_ROWS
, ia boleh dipermudahkan kepada tulisan berikut: SELECT SQL_CALC_FOUND_ROWS * FROM tbl WHERE … limit m,n;
SELECT FOUND_ROWS();
Yang kedua SELECT
akan kembali SELECT
pertama ialah jumlah bilangan baris tanpa had, jadi anda hanya perlu melaksanakan pertanyaan yang memakan masa dan kompleks untuk mendapatkan jumlah baris pada masa yang sama.
KUNCI DALAM MOD KONGSI, UNTUK KEMASKINI
Begitu juga, kedua-dua ini bukan petua pengoptimuman yang mengawal penyataan SELECT. Ia hanya sah untuk peringkat baris kunci, yang disokong oleh InnoDB.
Meluaskan pengetahuan:
Konsep dan perbezaan
SELECT ... LOCK IN SHARE MODE
Apa yang ditambah ialah kunci IS (kunci kongsi niat), iaitu kunci dikongsi ditambahkan pada semua baris yang layak Sesi lain boleh membaca rekod dan terus menambah kunci IS, tetapi ia tidak boleh diubah suai sehingga sesi terkunci selesai . (Jika tidak, masa tunggu kunci langsung tamat).
SELECT ... FOR UPDATE
Apa yang ditambahkan ialah kunci IX (kunci eksklusif niat), iaitu, eksklusif ditambahkan pada baris yang memenuhi syarat Sesi lain tidak boleh menambah sebarang kunci S atau kunci X pada rekod ini. Jika tiada bacaan tanpa kunci yang konsisten, sesi lain tidak boleh membaca dan mengubah suai rekod ini, tetapi innodb mempunyai bacaan tidak mengunci (bacaan syot kilat tidak memerlukan penguncian).
Oleh itu, kaedah penguncian for update
hanya menyekat kaedah pertanyaan lock in share mode
lebih daripada kaedah select...lock in share mode
dan tidak menyekat bacaan syot kilat.
Senario Aplikasi
LOCK IN SHARE MODE
terpakai pada senario penulisan dua jadual dengan hubungan Mengambil contoh rasmi MySQL, satu jadual ialah jadual anak, dan yang satu lagi ialah jadual anak. Ia adalah jadual induk. Andaikan lajur tertentu child_id jadual anak dipetakan ke lajur c_child_id jadual induk, adalah berisiko untuk memasukkan rekod child_id =100 ke dalam jadual anak pada masa ini, kerana jadual induk mungkin dilaksanakan pada masa yang sama dengan sisipan Untuk memadamkan rekod dengan c_child_id=100, terdapat risiko ketidakkonsistenan data perniagaan. Kaedah yang betul ialah melaksanakan select * from parent where c_child_id=100 lock in share mode
dahulu, kunci rekod ini dalam jadual induk, dan kemudian laksanakan insert into child(child_id) values (100)
.
[Cadangan berkaitan: tutorial video mysql]
Atas ialah kandungan terperinci apakah petunjuk mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!