informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Bahasa SQL dibagi menjadi empat kategori: bahasa kueri data DQL, bahasa manipulasi data DML, bahasa definisi data DDL, dan bahasa kontrol data DCL.
1. DQL Bahasa Kueri Data
Struktur dasar bahasa query data DQL adalah blok query yang terdiri dari klausa SELECT, klausa FROM, dan klausa WHERE: SELECT <nama field tabel> FROM <nama tabel atau tampilan> WHERE <kondisi query>
2. DML Bahasa Manipulasi Data
Ada tiga bentuk utama bahasa manipulasi data DML:
1) Sisipkan: MASUKKAN
2) Pembaruan: PEMBARUAN
3) Hapus: HAPUS
3. DDL Bahasa Definisi Data
Bahasa definisi data DDL digunakan untuk membuat berbagai objek dalam database ----- tabel, tampilan, indeks, sinonim, cluster, dll, seperti: CREATE TABLE / VIEW / INDEX / SYN / CLUSTER | Cluster sinonim indeks tampilan tabel . Operasi DDL dikirimkan secara implisit! Tidak dapat melakukan rollback
4. Bahasa Kontrol Data DCL
Bahasa kontrol data DCL digunakan untuk memberikan atau mencabut hak istimewa tertentu untuk mengakses database, mengontrol waktu dan efek transaksi manipulasi database, dan memantau database. menyukai:
1) HIBAH: Otorisasi.
2) ROLLBACK [WORK] TO [SAVEPOINT]: Mengembalikan ke titik tertentu. Rollback---ROLLBACK Perintah rollback mengembalikan status database ke status terakhir yang dikirimkan. Formatnya adalah: SQL>ROLLBACK;
3) KOMITMEN [KERJA]: Kirim. Selama operasi penyisipan, penghapusan, dan modifikasi basis data, transaksi diselesaikan hanya ketika transaksi tersebut diserahkan ke basis data. Sebelum transaksi dilakukan, hanya orang yang mengoperasikan database yang mempunyai hak untuk melihat apa yang telah dilakukan.
Perintah otorisasi basis data:
GRANT<izin> pada nama tabel (atau nama kolom) kepada pengguna
Pilihan jawaban yang benar B: masukkan, pilih: izin nama tabel: pengguna pengguna: nkw
Izin daur ulang poin pengetahuan tambahan
REVOKE <izin> pada nama tabel (atau nama kolom) DARI pengguna
Saya yakin semua orang sudah familiar dengan pernyataan penjelasan, yang digunakan sebagai pernyataan untuk melihat rencana eksekusi. jelaskan sering digunakan dalam analisis optimasi SQL.
Perlu diperhatikan di sini: penjelasan tidak benar-benar mengeksekusi pernyataan, tetapi hanya menampilkan rencana eksekusi.
Informasi apa yang dapat saya lihat?
- EXPLAIN SELECT select具体语句
- 如:
- EXPLAIN SELECT * FROM userpro
Daftar | menggambarkan | Mengisi kembali |
pengenal | Setiap kata kunci SELECT berhubungan dengan sebuah id | |
Pilih tipe | Jenis kueri yang sesuai dengan kata kunci SELECT | |
meja | Nama Tabel | |
partisi | Informasi partisi yang cocok | |
jenis | Metode akses untuk tabel tunggal | |
kemungkinan_kunci | Indeks yang mungkin | |
kunci | indeks aktual yang digunakan | |
kunci_len | Panjang indeks sebenarnya yang digunakan | |
referensierensi | Saat menggunakan kueri kesetaraan kolom indeks, informasi objek yang cocok dengan kolom indeks untuk kesetaraan. | |
baris | Perkiraan jumlah catatan yang harus dibaca | |
tersaring | Persentase rekaman yang tersisa setelah difilter berdasarkan kriteria pencarian |
|
Tambahan | informasi tambahan |
1,id
Setiap kata kunci SELECT berhubungan dengan sebuah id
Semakin besar nilai id maka semakin tinggi prioritasnya dan akan dieksekusi terlebih dahulu.
Jika ID-nya sama, maka dapat dianggap sebagai satu grup dan dieksekusi secara berurutan dari atas ke bawah.
Setiap nomor ID mewakili kueri independen. Semakin sedikit jumlah kueri dalam pernyataan SQL, semakin baik.
2,pilih_jenis
kategori | menjelaskan |
SEDERHANA | Kueri tabel tunggal, tanpa kueri subkueri atau UNION. |
UTAMA | Pernyataan SELECT terluar dalam kueri. |
SUBKUERI | Subquery digunakan dalam klausa WHERE. |
BERASAL DARI | Untuk subkueri yang terdapat dalam klausa FROM, MySQL akan menandainya sebagai DERIVED (turunan) dan menghasilkan tabel sementara untuk kumpulan hasilnya untuk digunakan oleh kueri luar. |
PERSATUAN | Pernyataan kueri kedua dan selanjutnya dalam kueri UNION. |
HASIL SERIKAT | Kumpulan hasil kueri UNION. |
SUBQUERY TERGANTUNG | Hasil subkueri bergantung pada nilai kueri luar, dan subkueri dijalankan satu kali untuk setiap baris di kueri luar. |
SERIKAT YANG TERGANTUNG | Pernyataan kueri kedua dan selanjutnya dari kueri UNION, dan hasilnya bergantung pada nilai kueri luar |
SUBQUERY YANG TAK DAPAT DI-CACHE | Subkueri tidak dapat di-cache dan akan dieksekusi setiap kali direferensikan. |
3. Kolom tabel mewakili nama tabel dari tabel (terkadang bukan nama tabel sebenarnya, bisa juga singkatannya).
4. partisi (opsional)
5. ketik ☆
Tipe yang umum adalah sebagai berikut
jenis | menjelaskan |
sistem | Biasanya hanya ada satu baris dalam tabel SELECT ... FROM DUAL Pengoptimalan kueri. |
konstan | Kueri ditemukan melalui indeks satu kali, dengan hanya satu baris hasil (tabel konstan). |
persamaan_ref | Gunakan indeks unik atau kunci utama untuk menemukan baris dari tabel lain. |
referensierensi | Gunakan indeks non-unik untuk menemukan satu atau lebih baris dari tabel lain. |
jangkauan | Kembalikan rentang baris menggunakan indeks. |
indeks | Memindai indeks sepenuhnya untuk menemukan baris, bukan memindai seluruh tabel. |
semua | Pemindaian tabel lengkap memeriksa setiap baris dalam tabel. |
Secara umum, cobalah untuk menghindari semuanya
6, kunci dan kemungkinan_kunci
kunci:
key
bidang menunjukkan indeks sebenarnya yang digunakan oleh kueri.Jika nilai bidang ini adalahNULL
, menunjukkan bahwa tidak ada indeks yang digunakan. Jika bidang ini memiliki nilai, itu berarti MySQL menggunakan indeks yang ditentukan untuk menjalankan kueri.kemungkinan_kunci:
possible_keys
Bidang menampilkan daftar indeks yang dapat digunakan MySQL. Indeks ini adalah indeks yang dapat dipertimbangkan dalam kueri, namun sebenarnya tidak dapat digunakan. biasanya,possible_keys
Indeks yang tercantum ditentukan berdasarkan kondisi kueri dan struktur tabel.jika key
Bidang memiliki nama indeks, danpossible_keys
Beberapa nama indeks terdaftar di , menunjukkan bahwa MySQL telah memilihkey
Indeks tempat bidang dicantumkan digunakan untuk melakukan kueri, sedangkan indeks lainnya dicantumkanpossible_keys
Medium bilang bisa juga dipertimbangkan, tapi akhirnya tidak dipakai.
jika key
Bidangnya adalahNULL
,Dan possible_keys
Beberapa nama indeks dicantumkan di , yang menunjukkan bahwa MySQL tidak menggunakan indeks apa pun saat menjalankan kueri, yang dapat mengakibatkan pemindaian tabel penuh atau metode akses lain yang tidak dioptimalkan indeks.
7, kunci_len
key_len
Adalah bidang yang menjelaskan panjang kunci indeks. Ini menunjukkan penggunaan indeks dan panjang kunci indeks ketika MySQL menggunakan indeks tertentu untuk mengeksekusi kueri.
Indeks kolom tunggal:
INT
),Tetapi key_len
Nilainya adalah panjang kolom.VARCHAR
),Tetapi key_len
Nilai adalah panjang maksimum bidang.indeks komposit:
key_len
Mewakili total panjang semua kolom dalam indeks.indeks gabungan:
key_len
adalah panjang total semua kolom dalam indeks gabungan.awalan indeks:
key_len
Panjang sebenarnya dari bagian indeks yang digunakan akan ditampilkan.8,referensi
ref
Ini adalah bidang yang menggambarkan kondisi koneksi antar tabel atau menggunakan indeks non-unik untuk mencari. Ini menunjukkan kondisi gabungan mana atau indeks mana yang digunakan MySQL untuk mengakses tabel saat menjalankan kueri.
9,baris
rows
Merupakan perkiraan jumlah baris yang diakses atau diperiksa saat mengeksekusi query.
SELECT
Menanyakan,rows
Mewakili perkiraan jumlah baris yang akan dikembalikan.JOIN
) atau subkueri,rows
Dapat mewakili jumlah baris yang diakses selama operasi penggabungan.rows
Mungkin mewakili jumlah baris yang dipindai.10,disaring
Mewakili persentase baris yang difilter berdasarkan kondisi WHERE dan kondisi indeks. difilter mencerminkan efek pengoptimalan kueri yang diperkirakan oleh pengoptimal.
Kapan filtered
Jika mendekati 100%, ini berarti kondisi kueri telah secara efektif memfilter sebagian besar baris yang tidak memenuhi kondisi, yang biasanya merupakan indikator pengoptimalan yang baik.
Sebaliknya jika filtered
Nilai yang rendah mungkin menunjukkan bahwa kondisi kueri tidak cukup tepat atau pengoptimal tidak menggunakan indeks secara efektif untuk memfilter data.
11,Tambahan
Bidang informasi tambahan
Berikut ini beberapa hal yang umum Extra
Bidang dan artinya:
Menggunakan indeks:
Menggunakan dimana:
Menggunakan sementara:
Menggunakan filesort:
Rentang diperiksa untuk setiap catatan (peta indeks: ...):
range
Dalam tipe kueri.Pemindaian penuh pada kunci NULL:
Berbeda:
Menggunakan buffer gabungan (Block Nested Loop):
Tidak mungkin DIMANA:
Tidak ada tabel yang digunakan:
SELECT NOW()
。- CREATE TABLE s1 (
- id INT AUTO_INCREMENT,
- key1 VARCHAR(100),
- key2 INT,
- key3 VARCHAR(100),
- key_part1 VARCHAR(100),
- key_part2 VARCHAR(100),
- key_part3 VARCHAR(100),
- common_field VARCHAR(100),
- PRIMARY KEY (id),
- INDEX idx_key1 (key1),
- UNIQUE INDEX idx_key2 (key2),
- INDEX idx_key3 (key3),
- INDEX idx_key_part(key_part1, key_part2, key_part3)
- ) ENGINE=INNODB CHARSET=utf8;
- CREATE TABLE s2 (
- id INT AUTO_INCREMENT,
- key1 VARCHAR(100),
- key2 INT,
- key3 VARCHAR(100),
- key_part1 VARCHAR(100),
- key_part2 VARCHAR(100),
- key_part3 VARCHAR(100),
- common_field VARCHAR(100),
- PRIMARY KEY (id),
- INDEX idx_key1 (key1),
- UNIQUE INDEX idx_key2 (key2),
- INDEX idx_key3 (key3),
- INDEX idx_key_part(key_part1, key_part2, key_part3)
- ) ENGINE=INNODB CHARSET=utf8;
Data disiapkan sendiri.
Kueri tabel tunggal
EXPLAIN SELECT * FROM `s1`;
Bergabunglah dengan kueri
EXPLAIN SELECT * FROM `s1` INNER JOIN `s2`;
subkueri
- EXPLAIN SELECT * FROM s1 WHERE key1 IN (SELECT key2 FROM s2 WHERE common_field
- = 'a');
- #Union 去重
- EXPLAIN SELECT * FROM `s1` UNION SELECT * FROM `s2`;
- #Union 全查
- EXPLAIN SELECT * FROM `s1` UNION ALL SELECT * FROM `s2`;
Langkah terakhir adalah deduplikasi, sehingga tabel sementara akan digunakan. Namun, UNION ALL adalah kueri untuk semua, dan tidak ada pesan kueri tabel sementara yang akan muncul.
const (temukan indeks sekali, hanya satu baris hasil)
EXPLAIN SELECT * FROM s1 WHERE id = 10002;
eq_ref (temukan baris dari tabel lain menggunakan indeks unik atau kunci utama)
EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.id = s2.id;
ref (gunakan indeks non-unik untuk menemukan satu atau lebih baris dari tabel lain)
EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';
range (mengembalikan rentang baris menggunakan indeks)
EXPLAIN SELECT * FROM s1 WHERE key1 IN ('a', 'b', 'c');
indeks (pindai indeks sepenuhnya untuk menemukan baris)
EXPLAIN SELECT key_part2 FROM s1 WHERE key_part3 = 'a';
waktu desimal yang difilter
EXPLAIN SELECT * FROM s1 WHERE key1 > 'za' AND common_field = 'la'