MySQL 虛擬列和虛擬索引的實(shí)現(xiàn)
是什么
Mysql 5.7 中推出了一個(gè)非常實(shí)用的功能 虛擬列 Generated (Virtual) Columns
在MySQL 5.7中,支持兩種Generated Column,即Virtual Generated Column和Stored Generated Column,前者只將Generated Column保存在數(shù)據(jù)字典中(表的元數(shù)據(jù)),并不會(huì)將這一列數(shù)據(jù)持久化到磁盤上;后者會(huì)將Generated Column持久化到磁盤上,而不是每次讀取的時(shí)候計(jì)算所得。很明顯,后者存放了可以通過已有數(shù)據(jù)計(jì)算而得的數(shù)據(jù),需要更多的磁盤空間,與Virtual Column相比并沒有優(yōu)勢(shì),因此,MySQL 5.7中,不指定Generated Column的類型,默認(rèn)是Virtual Column。
如果需要Stored Generated Golumn的話,可能在Virtual Generated Column上建立索引更加合適
綜上,一般情況下,都使用Virtual Generated Column,這也是MySQL默認(rèn)的方式
能干嘛
能對(duì) where 條件 上使用函數(shù)等原因使索引失效 如使用函數(shù) 就可以對(duì)這個(gè) 字段和函數(shù)建立一個(gè)虛擬類和虛擬索引提高效率
怎么用
比如是 sys_user 表中 create_time

他是一個(gè)datetime 類型的
假設(shè)我們有一個(gè)查詢
SELECT dayofweek(create_time) from sys_user WHERE dayofweek(create_time) = 1
結(jié)果

執(zhí)行計(jì)劃

如果我們?yōu)閏reate_time 字段 建立索引 這個(gè)查詢語(yǔ)句 仍然無法使用索引 因?yàn)?函數(shù) 阻止了索引 (這里就不實(shí)驗(yàn)了啊 有興趣可以自己試試 肯定沒用)
建立一個(gè)虛擬列

ALTER TABLE `qzboot`.`sys_user` ADD COLUMN `create_time_dayofweek` tinyint(4) GENERATED ALWAYS AS (dayofweek(create_time)) VIRTUAL ;
新建一個(gè)虛擬索引

ALTER TABLE `qzboot`.`sys_user` ADD INDEX `test`(`create_time_dayofweek`) USING BTREE COMMENT '虛擬索引';
SELECT dayofweek(create_time) from sys_user WHERE dayofweek(create_time) = 1 # sql 改造 SELECT create_time_dayofweek from sys_user WHERE create_time_dayofweek = 1
結(jié)果

執(zhí)行計(jì)劃

虛擬列不存儲(chǔ)在數(shù)據(jù)行中,但虛擬列的元數(shù)據(jù)信息會(huì)存在于相關(guān)系統(tǒng)表中,對(duì)虛擬列的添加或者刪除只會(huì)涉及這些系統(tǒng)表,不會(huì)導(dǎo)致數(shù)據(jù)表的重建,所以效率很高
到此這篇關(guān)于MySQL 虛擬列和虛擬索引的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL 虛擬列和虛擬索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中一條update語(yǔ)句是如何執(zhí)行的
這篇文章主要給大家介紹了關(guān)于MySQL中一條update語(yǔ)句是如何執(zhí)行的相關(guān)資料,由于update涉及到數(shù)據(jù)的修改,所以很容易推斷,update語(yǔ)句比select語(yǔ)句會(huì)更復(fù)雜一些,需要的朋友可以參考下2022-03-03
詳解mysql中字符串轉(zhuǎn)為數(shù)字的三種方法
這篇文章主要為大家詳細(xì)介紹了mysql中字符串轉(zhuǎn)為數(shù)字的三種常用方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
Windows10下mysql 8.0.12解壓版安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Windows10下mysql 8.0.12解壓版安裝方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
MySQL日期格式化yyyy-mm-dd詳解(DATE_FORMAT()函數(shù))
MySQL提供了很多功能強(qiáng)大、方便易用的函數(shù),在進(jìn)行數(shù)據(jù)庫(kù)管理以及數(shù)據(jù)的查詢和操作時(shí),幫助我們提高對(duì)數(shù)據(jù)庫(kù)的管理效率,下面這篇文章主要給大家介紹了關(guān)于MySQL日期格式化yyyy-mm-dd(DATE_FORMAT()函數(shù))的相關(guān)資料,需要的朋友可以參考下2023-01-01
MySQL 中 DATE_FORMAT() 函數(shù)的使用及應(yīng)用場(chǎng)景
DATE_FORMAT() 是 MySQL 中的一個(gè)內(nèi)置函數(shù),用于格式化日期和時(shí)間數(shù)據(jù),它可以根據(jù)指定的格式字符串來展示日期和時(shí)間,使得數(shù)據(jù)更容易閱讀和理解,本文檔將詳細(xì)介紹 DATE_FORMAT() 函數(shù)的使用方法及其常見應(yīng)用場(chǎng)景,感興趣的朋友一起看看吧2024-12-12
MySQL?datetime類型與時(shí)間、日期格式字符串大小比較的方法
這篇文章主要介紹了MySQL?datetime類型與時(shí)間、日期格式字符串大小比較,本文使用的是mysql8.0.27版本,其他版本自測(cè)一下,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11

