首頁 資料庫 mysql教程 大揭秘! MySQL資料庫之索引

大揭秘! MySQL資料庫之索引

Jan 23, 2020 pm 10:40 PM
mysql

大揭秘! MySQL資料庫之索引

1、概述

索引是一種儲存引擎用於快速尋找記錄的資料結構,透過合理的使用資料庫索引可以大幅提高系統的存取效能,接下來主要介紹在

MySql資料庫中索引類型,以及如何建立出更合理且有效率的索引技巧。

註:這裡主要針對的是InnoDB儲存引擎的B Tree索引資料結構

#2、索引的優點

大幅減輕了伺服器需要掃描的資料量,從而提高了資料的檢索速度

幫助伺服器避免排序和臨時表

可以將隨機I/O變為順序I/O

3、索引的建立

#3.1、主鍵索引

ALTER TABLE 'table_name' ADD PRIMARY KEY 'index_name' ('column');
登入後複製

3.2、唯一索引

#
ALTER TABLE 'table_name' ADD UNIQUE 'index_name' ('column');
登入後複製

3.3、普通索引

ALTER TABLE 'table_name' ADD INDEX 'index_name' ('column');
登入後複製

3.4、全文索引

ALTER TABLE 'table_name' ADD FULLTEXT 'index_name' ('column');
登入後複製

3.5、組合索引

ALTER TABLE 'table_name' ADD INDEX 'index_name' ('column1', 'column2', ...);
登入後複製

4、B Tree的索引規則

#建立一個測試的使用者表

DROP TABLE IF EXISTS user_test;CREATE TABLE user_test(    id int AUTO_INCREMENT PRIMARY KEY,
    user_name varchar(30) NOT NULL,
    sex bit(1) NOT NULL DEFAULT b'1',
    city varchar(50) NOT NULL,
    age int NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
登入後複製

建立一個組合索引: ALTER TABLE user_test ADD INDEX idx_user(user_name , city , age);

4.1、索引有效的查詢

#4.1.1、全值符合

全值匹配指的是和索引中的所有列進行匹配,如:以上面創建的索引為例,在where條件後可同時查詢(user_name,city,age)為

條件的資料。

註:與where後查詢條件的順序無關,這裡是很多同學容易誤解的一個地方

SELECT * FROM user_test WHERE user_name = 'feinik' AND age = 26 AND city = '广州';
登入後複製

4.1.2、匹配最左前綴

比對最左前綴是指優先匹配最左索引列,如:上面建立的索引可用於查詢條件為:(user_name )、(user_name, city)、(user_name , city , age)

註:滿足最左前綴查詢條件的順序與索引列的順序無關,如:(city, user_name)、(age, city, user_name)

4.1.3、符合列前綴

#指符合列值的開頭部分,如:查詢使用者名稱以feinik開頭的所有使用者

SELECT * FROM user_test WHERE user_name LIKE 'feinik%';
登入後複製
登入後複製

4.1.4、符合範圍值

如:查詢用戶名以feinik開頭的所有用戶,這裡使用了索引的第一列

SELECT * FROM user_test WHERE user_name LIKE 'feinik%';
登入後複製
登入後複製

4.2、索引的限制

1、where查詢條件中不包含索引列中最左邊的索引列,則無法使用到索引查詢,如:

SELECT * FROM user_test WHERE city = '广州';
登入後複製

SELECT * FROM user_test WHERE age= 26;
登入後複製


SELECT * FROM user_test WHERE city = '广州' AND age = '26';
登入後複製

2、即使where的查詢條件是最左索引列,也無法使用索引查詢使用者名稱以feinik結尾的使用者

SELECT * FROM user_test WHERE user_name like '%feinik';
登入後複製

3、如果where查詢條件中有某個列的範圍查詢,則其右邊的所有欄位都無法使用索引最佳化查詢,如:

SELECT * FROM user_test WHERE user_name = 'feinik' AND city LIKE '广州%' AND age = 26;
登入後複製

5、高效率的索引策略

5.1、索引列不能是表達式的一部分,也不能作為函數的參數,否則無法使用索引查詢。

SELECT * FROM user_test WHERE user_name = concat(user_name, 'fei');
登入後複製

5.2、前綴索引

有時候需要索引很長的字元列,這會增加索引的儲存空間以及降低索引的效率,一種策略是可以使用哈希索引,還有一種就是可以使

用前綴索引,前綴索引是選擇字元列的前n個字元作為索引,這樣可以大大節約索引空間,從而提高索引效率。

5.2.1、前綴索引的選擇性

#前綴索引要選擇足夠長的前綴以保證高的選擇性,同時又不能太長,我們可以透過以下方式來計算出適當的前綴索引的選擇長度值:

(1)

SELECT COUNT(DISTINCT index_column)/COUNT(*) FROM table_name; -- index_column代表要添加前缀索引的列
登入後複製

註:透過以上方式來計算出前綴索引的選擇性比值,比值越高說明索引的效率也越有效率。

(2)

#
SELECTCOUNT(DISTINCT LEFT(index_column,1))/COUNT(*),COUNT(DISTINCT LEFT(index_column,2))/COUNT(*),COUNT(DISTINCT
 LEFT(index_column,3))/COUNT(*)
 ...FROM table_name;
登入後複製

##「註:透過上述語句逐步找到最接近(1)中的前綴索引的選擇性比值,那麼就可以使用對應的字元截取長度來做前綴索引了

5.2.2、前綴索引的建立

ALTER TABLE table_name ADD INDEX index_name (index_column(length));
登入後複製

5.2.3、使用前綴索引的注意點

前綴索引是一種能讓索引更小,更快的有效方法,但是MySql無法使用前綴索引做ORDER BY 和GROUP BY以及使用前綴索引做覆蓋

掃描。

5.3、选择合适的索引列顺序

在组合索引的创建中索引列的顺序非常重要,正确的索引顺序依赖于使用该索引的查询方式,对于组合索引的索引顺序可以通过经验

法则来帮助我们完成:将选择性最高的列放到索引最前列,该法则与前缀索引的选择性方法一致,但并不是说所有的组合索引的顺序

都使用该法则就能确定,还需要根据具体的查询场景来确定具体的索引顺序。

5.4 聚集索引与非聚集索引

1、聚集索引

聚集索引决定数据在物理磁盘上的物理排序,一个表只能有一个聚集索引,如果定义了主键,那么InnoDB会通过主键来聚集数据,如

果没有定义主键,InnoDB会选择一个唯一的非空索引代替,如果没有唯一的非空索引,InnoDB会隐式定义一个主键来作为聚集索

引。

聚集索引可以很大程度的提高访问速度,因为聚集索引将索引和行数据保存在了同一个B-Tree中,所以找到了索引也就相应的找到了

对应的行数据,但在使用聚集索引的时候需注意避免随机的聚集索引(一般指主键值不连续,且分布范围不均匀),如使用UUID来作

为聚集索引性能会很差,因为UUID值的不连续会导致增加很多的索引碎片和随机I/O,最终导致查询的性能急剧下降。

2、非聚集索引

与聚集索引不同的是非聚集索引并不决定数据在磁盘上的物理排序,且在B-Tree中包含索引但不包含行数据,行数据只是通过保存在

B-Tree中的索引对应的指针来指向行数据,如:上面在(user_name,city, age)上建立的索引就是非聚集索引。

5.5、覆盖索引

如果一个索引(如:组合索引)中包含所有要查询的字段的值,那么就称之为覆盖索引,如:

SELECT user_name, city, age FROM user_test WHERE user_name = 'feinik' AND age > 25;

因为要查询的字段(user_name, city, age)都包含在组合索引的索引列中,所以就使用了覆盖索引查询,查看是否使用了覆盖索引可

以通过执行计划中的Extra中的值为Using index则证明使用了覆盖索引,覆盖索引可以极大的提高访问性能。

5.6、如何使用索引来排序

在排序操作中如果能使用到索引来排序,那么可以极大的提高排序的速度,要使用索引来排序需要满足以下两点即可。

1、ORDER BY子句后的列顺序要与组合索引的列顺序一致,且所有排序列的排序方向(正序/倒序)需一致

2、所查询的字段值需要包含在索引列中,及满足覆盖索引

通过例子来具体分析

在user_test表上创建一个组合索引

ALTER TABLE user_test ADD INDEX index_user(user_name , city , age);

可以使用到索引排序的案例

1、SELECT user_name, city, age FROM user_test ORDER BY user_name;

2、SELECT user_name, city, age FROM user_test ORDER BY user_name, city;

3、SELECT user_name, city, age FROM user_test ORDER BY user_name DESC, city DESC;

4、SELECT user_name, city, age FROM user_test WHERE user_name = 'feinik' ORDER BY city;

注:第4点比较特殊一点,如果where查询条件为索引列的第一列,且为常量条件,那么也可以使用到索引

无法使用索引排序的案例

1、sex不在索引列中

SELECT user_name, city, age FROM user_test ORDER BY user_name, sex;
登入後複製

2、排序列的方向不一致

SELECT user_name, city, age FROM user_test ORDER BY user_name ASC, city DESC;
登入後複製

3、所要查询的字段列sex没有包含在索引列中

SELECT user_name, city, age, sex FROM user_test ORDER BY user_name;
登入後複製

4、where查询条件后的user_name为范围查询,所以无法使用到索引的其他列

SELECT user_name, city, age FROM user_test WHERE user_name LIKE 'feinik%' ORDER BY city;
登入後複製

5、多表连接查询时,只有当ORDER BY后的排序字段都是第一个表中的索引列(需要满足以上索引排序的两个规则)时,方可使用索

引排序。如:再创建一个用户的扩展表user_test_ext,并建立uid的索引。

DROP TABLE IF EXISTS user_test_ext;CREATE TABLE user_test_ext( id int AUTO_INCREMENT PRIMARY KEY,

 uid int NOT NULL,
 u_password VARCHAR(64) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;ALTER TABLE user_test_ext ADD INDEX 
 index_user_ext(uid);
登入後複製

走索引排序

SELECT user_name, city, age FROM user_test u LEFT JOIN user_test_ext ue ON u.id = ue.uid ORDER BY u.user_name;
登入後複製

不走索引排序

SELECT user_name, city, age FROM user_test u LEFT JOIN user_test_ext ue ON u.id = ue.uid ORDER BY ue.uid;
登入後複製

6、总结

本文主要讲了B+Tree树结构的索引规则,不同索引的创建,以及如何正确的创建出高效的索引技巧来尽可能的提高查询速度,当然了

关于索引的使用技巧不单单只有这些,关于索引的更多技巧还需平时不断的积累相关经验。

以上是大揭秘! MySQL資料庫之索引的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MySQL的角色:Web應用程序中的數據庫 MySQL的角色:Web應用程序中的數據庫 Apr 17, 2025 am 12:23 AM

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

docker怎麼啟動mysql docker怎麼啟動mysql Apr 15, 2025 pm 12:09 PM

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

解決數據庫連接問題:使用minii/db庫的實際案例 解決數據庫連接問題:使用minii/db庫的實際案例 Apr 18, 2025 am 07:09 AM

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

centos7如何安裝mysql centos7如何安裝mysql Apr 14, 2025 pm 08:30 PM

優雅安裝 MySQL 的關鍵在於添加 MySQL 官方倉庫。具體步驟如下:下載 MySQL 官方 GPG 密鑰,防止釣魚攻擊。添加 MySQL 倉庫文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 倉庫緩存:yum update安裝 MySQL:yum install mysql-server啟動 MySQL 服務:systemctl start mysqld設置開機自啟動

centos安裝mysql centos安裝mysql Apr 14, 2025 pm 08:09 PM

在 CentOS 上安裝 MySQL 涉及以下步驟:添加合適的 MySQL yum 源。執行 yum install mysql-server 命令以安裝 MySQL 服務器。使用 mysql_secure_installation 命令進行安全設置,例如設置 root 用戶密碼。根據需要自定義 MySQL 配置文件。調整 MySQL 參數和優化數據庫以提升性能。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

See all articles