偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

MySQL用了函數(shù)到底會不會導致索引失效

數(shù)據(jù)庫 MySQL
MySQL 8.0 引入了功能索引(Functional Indexes)的新特性,這種索引允許在創(chuàng)建時包含列上的表達式。這意味著可以對數(shù)據(jù)進行計算或轉(zhuǎn)換,并針對結(jié)果建立索引。即使在查詢中使用了函數(shù)操作,也可以利用這些索引來優(yōu)化查詢性能。

本次主要聊一聊關于函數(shù)到底會不會導致索引失效呢?

很多人認為,在使用函數(shù)后就無法使用索引。

這主要是因為索引是按照列值的原始順序組織和存儲的。當對列應用函數(shù)時(如數(shù)學運算、字符串操作或日期函數(shù)等),函數(shù)會改變原始數(shù)據(jù)的值或格式,使得數(shù)據(jù)庫無法直接定位到這些經(jīng)過函數(shù)轉(zhuǎn)換后的值。因此,數(shù)據(jù)庫不得不執(zhí)行全表掃描,以確保能夠評估所有行上的函數(shù)操作,這導致查詢性能下降。

在 MySQL 8.0 之后,引入了函數(shù)索引,這改變了以往對函數(shù)使用索引的限制。

MySQL 8.0 引入了功能索引(Functional Indexes)的新特性,這種索引允許在創(chuàng)建時包含列上的表達式。這意味著可以對數(shù)據(jù)進行計算或轉(zhuǎn)換,并針對結(jié)果建立索引。即使在查詢中使用了函數(shù)操作,也可以利用這些索引來優(yōu)化查詢性能。

功能索引不是直接在表的列上創(chuàng)建的,而是基于列的某個表達式創(chuàng)建的。這個表達式可以是簡單的數(shù)學運算,也可以是字符串函數(shù)、日期函數(shù)等。一旦創(chuàng)建了功能索引,MySQL 在執(zhí)行涉及該表達式的查詢時能夠使用這個索引,從而提升查詢效率。

使用方式

在 MySQL 8.0 中,您可以創(chuàng)建一個基于 first_name 和 last_name 合并后的表達式的功能索引,示例如下:

CREATE INDEX full_name_index ON employees ((CONCAT(first_name, ' ', last_name)));

這個例子中,我們使用了 CONCAT 函數(shù)將 first_name 和 last_name 合并成一個全名,并在創(chuàng)建索引時使用了這個表達式 (CONCAT(first_name, ' ', last_name))。這樣一來,即使在查詢中直接使用全名的合并結(jié)果,MySQL 也能夠利用 full_name_index 索引來優(yōu)化查詢性能。

SELECT * FROM employees WHERE CONCAT(first_name, ' ', last_name) = 'Pai daxing';

圖片圖片

如上圖所示,執(zhí)行計劃顯示我們成功利用了 idx_full_name索引!

因此,即使在查詢的 WHERE 子句中使用了 CONCAT 函數(shù),我們依然能夠充分利用 idx_full_name 函數(shù)索引,從而有效提升了查詢的效率。

注意事項

函數(shù)索引雖然能夠顯著提高涉及索引表達式的查詢性能,但其創(chuàng)建可能增加數(shù)據(jù)插入、更新和刪除的成本,因為數(shù)據(jù)庫需要維護更多的索引數(shù)據(jù)。因此,在創(chuàng)建函數(shù)索引時需要謹慎,不能盲目使用。

使用函數(shù)索引時,必須仔細考慮和測試,以確保性能提升符合預期。

此外,在創(chuàng)建函數(shù)索引時,需要確保表達式是確定的,即對于給定的輸入值始終產(chǎn)生相同的輸出值。非確定性表達式不適合用于函數(shù)索引。

常見函數(shù)索引用法

給大家列舉一些常見的函數(shù)索引的使用。

字符串處理

當您經(jīng)常需要根據(jù)某個字符串列的某部分進行查詢時,可以考慮使用函數(shù)索引。例如,如果您希望根據(jù)郵箱地址的域名部分查詢用戶,可以創(chuàng)建如下的函數(shù)索引:

CREATE INDEX idx_email_domain ON users ((SUBSTRING_INDEX(email, '@', -1)));

這樣,當您查詢特定域名的郵箱時(例如 qq 郵箱),可以利用這個索引:

SELECT * FROM users WHERE SUBSTRING_INDEX(email, '@', -1) = 'qq.com';

日期和時間處理

對于涉及日期和時間處理的查詢,函數(shù)索引也非常有用。假設您需要頻繁查詢基于訂單日期的年份或月份,可以創(chuàng)建如下的索引:

CREATE INDEX idx_order_year ON orders ((YEAR(order_date)));
CREATE INDEX idx_order_month ON orders ((MONTH(order_date)));

這允許您高效地查詢特定年份或月份的訂單:

SELECT * FROM orders WHERE YEAR(order_date) = 2022;
SELECT * FROM orders WHERE MONTH(order_date) = 12;

數(shù)學運算

如果查詢條件經(jīng)常包含對數(shù)值列的數(shù)學運算,可以針對這些運算創(chuàng)建函數(shù)索引。例如,如果您希望根據(jù)產(chǎn)品折扣后的價格進行查詢,可以創(chuàng)建如下索引:

CREATE INDEX idx_discounted_price ON products ((price * (1 - discount_rate)));

然后,您可以高效地查詢特定范圍的折扣價格:

SELECT * FROM products WHERE price * (1 - discount_rate) BETWEEN 50 AND 100;

使用 JSON 函數(shù)

如果在 MySQL 中使用 JSON 數(shù)據(jù)類型,并且需要基于 JSON 屬性進行查詢,可以創(chuàng)建基于 JSON 函數(shù)的索引。例如,如果您有一個存儲 JSON 數(shù)據(jù)的列,并且希望根據(jù) JSON 文檔中的某個鍵進行查詢,可以創(chuàng)建如下索引:

CREATE INDEX idx_json_key ON orders ((JSON_UNQUOTE(JSON_EXTRACT(order_info, '$.status'))));

這樣,您可以高效地查詢具有特定狀態(tài)的訂單:

SELECT * FROM orders WHERE JSON_UNQUOTE(JSON_EXTRACT(order_info, '$.status')) = 'shipped';

大小寫不敏感的搜索

如果您需要執(zhí)行大小寫不敏感的字符串搜索,可以創(chuàng)建一個基于 LOWER() 或 UPPER() 函數(shù)的索引:

CREATE INDEX idx_lower_case_name ON customers ((LOWER(name)));

這樣可以讓您執(zhí)行大小寫不敏感的搜索,同時不影響性能:

SELECT * FROM customers WHERE LOWER(name) = LOWER('John Doe');

在使用函數(shù)索引時,需要權衡索引的維護成本和性能提升。雖然函數(shù)索引可以顯著提升特定查詢的性能,但它們也會增加插入、更新和刪除操作的成本,因為數(shù)據(jù)庫需要維護更多的索引數(shù)據(jù)。因此,在實際應用中,建議僅對那些經(jīng)常作為查詢條件的列和表達式創(chuàng)建函數(shù)索引。

責任編輯:武曉燕 來源: 碼上遇見你
相關推薦

2020-09-29 08:33:17

基站信號健康

2022-04-20 11:41:45

Kafka數(shù)據(jù)解決方案

2021-09-21 16:18:07

手機電池快充

2020-11-13 07:14:55

Kafka消息中間件

2024-10-08 09:35:23

2020-07-20 15:20:44

ThreadLocalJava多線程

2020-12-08 09:45:07

MySQL數(shù)據(jù)庫索引

2019-01-21 16:54:24

車聯(lián)網(wǎng)智能手機系統(tǒng)iOS

2012-04-16 15:05:39

數(shù)據(jù)壟斷互聯(lián)網(wǎng)

2022-06-27 07:23:44

MySQL常量優(yōu)化

2020-09-29 11:33:11

5G

2024-05-31 13:04:09

2024-06-03 00:00:01

索引MySQL技術

2012-07-13 16:29:30

2024-12-11 08:09:54

2012-12-18 12:55:45

2024-11-18 08:03:30

Java多次啟動線程

2024-12-20 07:30:00

2023-02-11 08:18:15

AI人工智能ChatGPT

2021-02-07 18:07:28

大數(shù)據(jù)AI人工智能
點贊
收藏

51CTO技術棧公眾號