Dalam MySQL, indeks merujuk kepada "indeks", iaitu struktur pangkalan data khas yang terdiri daripada satu atau lebih lajur dalam jadual data. Ia boleh digunakan untuk menanyakan dengan pantas lajur tertentu dalam rekod nilai . Melalui indeks, apabila menanyakan data, anda tidak perlu membaca semua maklumat rekod, tetapi hanya menanyakan lajur indeks jika tidak, sistem pangkalan data akan membaca semua maklumat setiap rekod untuk dipadankan. Oleh itu, menggunakan indeks boleh meningkatkan kelajuan pertanyaan pangkalan data dan meningkatkan prestasi sistem pangkalan data dengan berkesan.
Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.
Dalam MySQL, indeks merujuk kepada "indeks", iaitu struktur pangkalan data khas yang terdiri daripada satu atau lebih lajur dalam jadual data. Ia boleh digunakan untuk menanyakan dengan pantas lajur tertentu dalam rekod nilai .
Melalui indeks, apabila menanyakan data, anda tidak perlu membaca semua maklumat yang direkodkan, tetapi hanya menanya lajur indeks. Jika tidak, sistem pangkalan data akan membaca semua maklumat setiap rekod untuk dipadankan.
Indeks boleh dibandingkan dengan urutan fonetik Kamus Xinhua. Sebagai contoh, jika anda ingin mencari perkataan "ku", jika anda tidak menggunakan urutan fonetik, anda perlu mencarinya halaman demi halaman dalam 400 halaman kamus. Walau bagaimanapun, jika anda mengekstrak pinyin untuk membentuk urutan fonetik, anda hanya perlu mencarinya terus daripada jadual fonetik lebih daripada 10 halaman. Ini boleh menjimatkan banyak masa.
Oleh itu, menggunakan indeks boleh meningkatkan kelajuan pertanyaan pangkalan data dan meningkatkan prestasi sistem pangkalan data dengan berkesan.
Mengapa menggunakan indeks
Indeks ialah hubungan antara nilai lajur dan baris rekod yang ditubuhkan dalam susunan tertentu berdasarkan satu atau beberapa lajur dalam jadual Jadual surat-menyurat pada asasnya ialah jadual tersusun yang menerangkan kesesuaian satu-satu antara nilai lajur lajur indeks dan baris rekod dalam jadual asal.
Indeks ialah objek pangkalan data yang sangat penting dalam MySQL Ia adalah asas teknologi penalaan prestasi pangkalan data dan sering digunakan untuk mencapai perolehan semula data dengan pantas.
Dalam MySQL, biasanya terdapat dua cara untuk mengakses data baris jadual pangkalan data:
1) Akses berurutan
Akses berurutan adalah untuk melakukan imbasan jadual penuh pada jadual. Lintas baris demi baris dari awal hingga akhir sehingga anda menemui data sasaran yang memenuhi syarat dalam data baris tidak tersusun.
Akses berjujukan agak mudah untuk dilaksanakan, tetapi apabila terdapat sejumlah besar data dalam jadual, kecekapan adalah sangat rendah. Sebagai contoh, apabila mencari sejumlah kecil data di antara berpuluh-puluh juta data, menggunakan akses berjujukan akan merentasi semua data, yang akan mengambil banyak masa dan jelas akan menjejaskan prestasi pemprosesan pangkalan data.
2) Akses indeks
Akses indeks ialah cara untuk mengakses terus baris rekod dalam jadual dengan merentasi indeks.
Premis menggunakan kaedah ini adalah untuk mencipta indeks pada jadual Selepas mencipta indeks pada lajur, apabila mencari data, anda boleh terus mencari lokasi baris rekod yang sepadan berdasarkan indeks pada. lajur, supaya cepat mencari data. Indeks menyimpan penunjuk kepada nilai data lajur yang ditentukan, mengisih penunjuk ini mengikut susunan isihan yang ditentukan.
Contohnya, dalam jadual maklumat asas pelajar tb_pelajar, jika indeks diwujudkan berdasarkan student_id, sistem mencipta jadual pemetaan daripada lajur indeks kepada rekod sebenar. Apabila pengguna perlu mencari data dengan student_id 12022, sistem mula-mula mencari rekod pada indeks student_id, kemudian mencari terus baris data melalui jadual pemetaan dan mengembalikan baris data. Oleh kerana kelajuan mengimbas indeks secara amnya jauh lebih besar daripada kelajuan mengimbas baris data sebenar, menggunakan indeks boleh meningkatkan kecekapan pangkalan data.
Ringkasnya, tanpa menggunakan indeks, MySQL mesti membaca keseluruhan jadual bermula dari rekod pertama sehingga ia menemui baris yang berkaitan. Lebih besar jadual, lebih banyak masa yang diperlukan untuk menanyakan data. Jika lajur yang ditanya dalam jadual mempunyai indeks, MySQL boleh dengan cepat pergi ke lokasi untuk mencari fail data tanpa perlu melihat semua data, yang akan menjimatkan banyak masa.
Kebaikan dan Kelemahan Indeks
Indeks mempunyai kelebihan yang jelas dan kelemahannya yang tidak dapat dielakkan.
Kelebihan
Kelebihan indeks adalah seperti berikut:
Dengan mencipta indeks yang unik, setiap baris data dalam jadual pangkalan data boleh dijamin unik.
Boleh menetapkan indeks untuk semua jenis lajur MySQL.
boleh mempercepatkan pertanyaan data, yang merupakan sebab utama untuk menggunakan indeks.
boleh mempercepatkan sambungan antara jadual dari segi mencapai integriti rujukan data.
Apabila menggunakan klausa pengumpulan dan pengisihan untuk pertanyaan data, masa pengumpulan dan pengisihan dalam pertanyaan juga boleh dikurangkan dengan ketara
Kelemahan
Meningkatkan indeks juga mempunyai banyak kelemahan, terutamanya seperti berikut:
Mencipta dan menyelenggara kumpulan indeks mengambil masa, dan apabila jumlah data meningkat, Masa juga akan bertambah.
Indeks perlu menduduki ruang cakera Selain ruang data yang diduduki oleh jadual data, setiap indeks juga menduduki sejumlah ruang fizikal. Jika anda mempunyai bilangan indeks yang banyak, fail indeks mungkin mencapai saiz fail maksimumnya lebih cepat daripada fail data.
Apabila menambah, memadam dan mengubah suai data dalam jadual, indeks juga mesti dikekalkan secara dinamik, yang mengurangkan kelajuan penyelenggaraan data.
Apabila menggunakan indeks, anda perlu mempertimbangkan kebaikan dan keburukan indeks.
Indeks boleh meningkatkan kelajuan pertanyaan, tetapi akan menjejaskan kelajuan memasukkan rekod. Kerana apabila memasukkan rekod ke dalam jadual yang diindeks, sistem pangkalan data akan menyusun mengikut indeks, yang mengurangkan kelajuan memasukkan rekod Kesan kelajuan akan menjadi lebih jelas apabila memasukkan sejumlah besar rekod. Dalam kes ini, cara terbaik ialah memadam indeks dalam jadual dahulu, kemudian masukkan data, dan kemudian buat indeks selepas sisipan selesai.
Prinsip reka bentuk indeks
1) Perlu diingatkan bahawa indeks juga menduduki ruang cakera, jadi lebih banyak lebih baik.
2) Terlalu banyak indeks akan menjejaskan kecekapan pelaksanaan INSERT, DELETE, UPDATE dan pernyataan lain.
3) Tidak disyorkan untuk mencipta indeks jika terdapat terlalu sedikit data.
4) Untuk kekangan unik, indeks unik yang sepadan harus digunakan.
5) Cuba jangan mengindeks medan dengan perbezaan yang rendah. Contohnya: medan jantina jenis penghitungan hanya mempunyai lelaki dan wanita, yang tidak akan mencapai kesan pengoptimuman.
6) Adalah disyorkan untuk mencipta indeks semasa mencipta jadual. Jika terdapat sejumlah besar rekod dalam jadual, semua rekod dalam jadual akan diubah suai selepas lajur dibuat sebagai indeks.
7) Tidak disyorkan untuk membuat indeks untuk medan yang tidak kerap ditanya.
类型 | 作用 |
---|---|
普通索引 | 基本索引方式,无特别说明 |
唯一性索引 | 数据唯一,允许有null |
主键索引 | 表中只有一个主键,数据唯一,不允许有null |
复合索引 | 可以包含两个或多个列的索引方式 |
Hanya pilih jenis indeks yang sepadan mengikut persekitaran yang berbeza.
Ambil indeks biasa sebagai contoh sebagai contoh. Apabila mengubah suai jadual untuk mengindeks
create table 表名( 字段定义… index 索引名称(字段));
, anda boleh menggunakan kunci dan bukannya indeks, dan nama indeks boleh ditinggalkan Jika tiada nama indeks ditambahkan, nama medan akan digunakan sebagai nama indeks secara lalai.
alter table 表名 add index 索引名称(字段);
Lihat struktur jadual di bawah kekunci mewakili indeks biasa
mysql> create table test1(id int,name varchar(5),age tinyint,index index_id(id));
Lihat maklumat indeks
mysql> desc test1; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | YES | MUL | NULL | | | name | varchar(5) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | +-------+------------+------+-----+---------+-------+
Tambahkan beberapa data pada jadual untuk ujian
mysql> show index from test1\G *************************** 1. row *************************** Table: test1 Non_unique: 1 Key_name: index_id Seq_in_index: 1 Column_name: id Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: YES Expression: NULL 1 row in set (0.00 sec)
Simulasikan pelaksanaan pernyataan pertanyaan sql melalui
terangkanmysql> insert into test1 values(1,'张三',21),(2,'李四',22),(3,'王五',23),(4,'赵六',24);
Jenis: SEMUA item menunjukkan imbasan jadual penuh, dan baris: 4 menunjukkan bilangan baris. Kerana Zhao Liu adalah rekod terakhir dalam jadual, pertanyaan merentasi seluruh jadual.
mysql> explain select * from test1 where name='赵六'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test1 partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4 filtered: 25.00 Extra: Using where 1 row in set, 1 warning (0.00 sec)
baris: 1 bermakna hanya satu baris telah diambil dan rekod telah dijumpai.
mysql> explain select * from test1 where id=4\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test1 partitions: NULL type: ref possible_keys: index_id key: index_id key_len: 5 ref: const rows: 1 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.00 sec)
Sintaks:
Indeks unik biasanya digunakan dalam medan yang nilainya tidak boleh diulang, nombor ID, nombor telefon mudah alih, dsb.
create table 表名( 字段定义… unique key 索引名(字段名));
Lihat struktur jadual, UNI di bawah kekunci diwakili sebagai indeks unik
mysql> create table test2(id int,name varchar(5),phone int,unique key unique_key_phone(phone));
Sisipkan data dan uji ciri
mysql> desc test2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(5) | YES | | NULL | | | phone | int(11) | YES | UNI | NULL | | +-------+------------+------+-----+---------+-------+
Lihat jadual data
mysql> insert into test2 values(1,'张三',1111111111); mysql> insert into test2 values(2,'李四',null); #可以为null mysql> insert into test2 values(3,'王五',1111111111); #值必须唯一 ERROR 1062 (23000): Duplicate entry '1111111111' for key 'unique_key_phone'
mysql> select * from test2; +------+--------+------------+ | id | name | phone | +------+--------+------------+ | 2 | 李四 | NULL | | 1 | 张三 | 1111111111 | +------+--------+------------+
Sintaks:
buat nama jadual jadual (kunci utama medan); atau buat nama jadual jadual (
takrifan medan); …
Lihat struktur jadual dan PRI di bawah kunci Masukkan data ke dalam lajur indeks kunci utama
mysql> create table test3(id int primary key,name varchar(5),age tinyint);
mysql> desc test3; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(5) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | +-------+------------+------+-----+---------+-------+
mysql> insert into test3 values(1,'张三',23); mysql> insert into test3 values(null,'张三',23); #不能为null ERROR 1048 (23000): Column 'id' cannot be null mysql> insert into test3 values(1,'张三',23); #值不能重复 ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> select * from test3; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | 张三 | 23 | +----+--------+------+
Ciri kunci utama komposit Ia agak berbeza daripada kunci utama Ia hanya perlu mempunyai satu medan yang tidak diulang.
Lihat data jadualmysql> create table test4 (id int,name varchar(5),age tinyint,primary key(id,name));
mysql> insert into test4 values(1,'张三',21); mysql> insert into test4 values(1,'李四',21); mysql> insert into test4 values(1,'张三',21); #主键列全重复 ERROR 1062 (23000): Duplicate entry '1-张三' for key 'PRIMARY'
]
Atas ialah kandungan terperinci indeks mysql apa maksudnya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!