cari
Rumahpembangunan bahagian belakangtutorial phpMySQL索引优化之覆盖索引

MySQL索引优化之覆盖索引

Mar 22, 2018 am 09:29 AM
mysqlindekspenutup

最近处理老的业务代码遇到个问题,本文主要和大家分享MySQL索引优化之覆盖索引,希望能帮助到大家。

最近处理老的业务代码遇到这么个例子:

表结构如下:

CREATE TABLE `group_user` ( 
  `id` int(11) NOT NULL auto_increment, 
  `uid` int(11) NOT NULL, 
  `username` varchar(16) NOT NULL,
  `gid` int(11) NOT NULL, 
  `create_time` int(10) NOT NULL, 
  `update_time` int(10) NOT NULL, 
  PRIMARY KEY  (`id`), 
  KEY `idx_uid` (`uid`), 
  KEY `idx_gid` (`gid`) 
) ENGINE=InnoDB AUTO_INCREMENT=1530312 DEFAULT CHARSET=utf8

150w的数据,这么一个语句:

SELECT SQL_NO_CACHE uid FROM group_user WHERE gid = 2 ORDER BY create_time ASC LIMIT 10;

慢查询日志里居然很多用了2秒的,Explain的结果是:

+----+-------------+------------+------+---------------+----------+---------+-------+------+--------------------------------+ 
| id | select_type | table      | type | possible_keys | key      | key_len | ref   | rows | Extra                          | 
+----+-------------+------------+------+---------------+----------+---------+-------+------+--------------------------------+ 
|  1 | SIMPLE      | group_user | ref  | idx_gid       | idx_gid  | 4       | const | 6535 | Using where; Using filesort    | 
+----+-------------+------------+------+---------------+----------+---------+-------+------+--------------------------------+

从Explain的结果可以看出,查询已经使用了索引,但为什么还这么慢?

分析:首先,该语句ORDER BY 使用了Using filesort文件排序,查询效率低;其次,查询字段不在索引上,没有使用覆盖索引,需要通过索引回表查询;最后,数据分布上,gid相同的比较多,uid散列比较均匀,只利用二级索引的效果一般(不清楚索引分类请点击:MySQL索引分类介绍)。

解决方案:由于只需查询uid字段,添加一个联合索引便可以避免回表和文件排序,利用覆盖索引提升查询速度,同时利用索引完成排序。

覆盖索引:MySQL只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据。

ALTER TABLE group_user ADD INDEX idx_gid_ctime_uid (gid, create_time, uid);

再Explain一次:

EXPLAIN SELECT SQL_NO_CACHE uid FROM group_user USE INDEX(idx_gid_ctime_uid) WHERE gid = 2 ORDER BY create_time ASC LIMIT 10;
+----+-------------+------------+------+-------------------+-------------------+---------+-------+------+--------------------------+ 
| id | select_type | table      | type | possible_keys     | key               | key_len | ref   | rows | Extra                    |
+----+-------------+------------+------+-------------------+-------------------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | group_user | ref  | idx_gid_ctime_uid | idx_gid_ctime_uid | 4       | const | 6375 | Using where; Using index |
+----+-------------+------------+------+-------------------+-------------------+---------+-------+------+--------------------------+

Extra信息已经有'Using Index',表示已经使用了覆盖索引(平时SELECT *的同事很多,坑)。

为什么语句需要手动指定使用哪个索引?因为MySQL查询优化器有可能使用了idx_gid这个索引,除非把它删除。

经过索引优化之后,线上的查询基本不超过0.001秒。

最后一个问题:如果这个表用的是MyISAM引擎呢,那么实际情况又会如何?

相关推荐:

Mysql索引优化方法

mysql的索引优化如何使用

Mysql优化之深入了解存储引擎,进行索引优化

Atas ialah kandungan terperinci MySQL索引优化之覆盖索引. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
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
Bagaimanakah PHP mengenal pasti sesi pengguna?Bagaimanakah PHP mengenal pasti sesi pengguna?May 01, 2025 am 12:23 AM

Phpidentifierauser'sSessionusingSessionCookiesandSessionIds.1) whensession_start () ISCALLED, phpGeneratesAuniquesessionIdstoredinacookienamedPhpsessidontheUserer'sBrowser.2) ThisIdallowsPhptoretRievesSessionDataFromtheserver.

Apakah beberapa amalan terbaik untuk mendapatkan sesi PHP?Apakah beberapa amalan terbaik untuk mendapatkan sesi PHP?May 01, 2025 am 12:22 AM

Keselamatan sesi PHP boleh dicapai melalui langkah -langkah berikut: 1. Gunakan session_regenerate_id () untuk menjana semula ID sesi apabila pengguna log masuk atau merupakan operasi penting. 2. Sulitkan ID sesi penghantaran melalui protokol HTTPS. 3. Gunakan session_save_path () untuk menentukan direktori selamat untuk menyimpan data sesi dan menetapkan kebenaran dengan betul.

Di manakah fail sesi php disimpan secara lalai?Di manakah fail sesi php disimpan secara lalai?May 01, 2025 am 12:15 AM

PhpsessionFileSarestoredIntHedirectorySpecifiedBySession.save_path, biasanya/tmponunix-likesystemsorc: \ windows \ temponwindows.tocustomethis: 1) usession_save_path ()

Bagaimana anda mengambil data dari sesi PHP?Bagaimana anda mengambil data dari sesi PHP?May 01, 2025 am 12:11 AM

ToretrievedataFromaphpsession, startTheSessionWithSsion_start () andaccessVariablesInthe $ _SessionArray.Forexample: 1) startTheSession: session_start ()

Bagaimana anda boleh menggunakan sesi untuk melaksanakan keranjang belanja?Bagaimana anda boleh menggunakan sesi untuk melaksanakan keranjang belanja?May 01, 2025 am 12:10 AM

Langkah -langkah untuk membina sistem keranjang belanja yang cekap menggunakan sesi termasuk: 1) Memahami definisi dan fungsi sesi. Sesi ini adalah mekanisme penyimpanan sisi pelayan yang digunakan untuk mengekalkan status pengguna merentasi permintaan; 2) melaksanakan pengurusan sesi asas, seperti menambah produk ke keranjang belanja; 3) memperluas penggunaan lanjutan, menyokong pengurusan kuantiti produk dan penghapusan; 4) Mengoptimumkan prestasi dan keselamatan, dengan berterusan data sesi dan menggunakan pengecam sesi yang selamat.

Bagaimana anda membuat dan menggunakan antara muka dalam PHP?Bagaimana anda membuat dan menggunakan antara muka dalam PHP?Apr 30, 2025 pm 03:40 PM

Artikel ini menerangkan cara membuat, melaksanakan, dan menggunakan antara muka dalam PHP, memberi tumpuan kepada manfaat mereka untuk organisasi kod dan penyelenggaraan.

Apakah perbezaan antara crypt () dan password_hash ()?Apakah perbezaan antara crypt () dan password_hash ()?Apr 30, 2025 pm 03:39 PM

Artikel ini membincangkan perbezaan antara crypt () dan password_hash () dalam php untuk hashing kata laluan, memberi tumpuan kepada pelaksanaan, keselamatan, dan kesesuaian untuk aplikasi web moden.

Bagaimanakah anda dapat mencegah skrip lintas tapak (XSS) dalam PHP?Bagaimanakah anda dapat mencegah skrip lintas tapak (XSS) dalam PHP?Apr 30, 2025 pm 03:38 PM

Artikel membincangkan mencegah skrip lintas tapak (XSS) dalam PHP melalui pengesahan input, pengekodan output, dan menggunakan alat seperti OWASP ESAPI dan pembersih HTML.

See all articles

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

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa