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à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數(shù)據(jù)庫外鍵?foreing?key
這篇文章主要介紹了MySQL數(shù)據(jù)庫外鍵?foreing?key,外鍵表示了兩個(gè)實(shí)體之間的聯(lián)系,更多相關(guān)介紹需要的小伙伴可以參考一下2022-06-06Mysql 5.7.18 解壓版下載安裝及啟動(dòng)mysql服務(wù)的圖文詳解
這篇文章主要介紹了Mysql 5.7.18 解壓版下載安裝及啟動(dòng)mysql服務(wù)的圖文詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05MySQL定位長事務(wù)(Identify Long Transactions)的實(shí)現(xiàn)
在MySQL的運(yùn)行中,經(jīng)常會(huì)遇到一些長事務(wù),本文主要介紹了MySQL定位長事務(wù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09mysql滑動(dòng)訂單問題原理與解決方法實(shí)例分析
這篇文章主要介紹了mysql滑動(dòng)訂單問題原理與解決方法,結(jié)合實(shí)例形式分析了mysql滑動(dòng)訂單的問題的基本原理、解決方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-12-12MySql?字符集不同導(dǎo)致?left?join?慢查詢的問題解決
當(dāng)兩個(gè)表的字符集不一樣,在使用字符型字段進(jìn)行表連接查詢時(shí),就需要特別注意下查詢耗時(shí)是否符合預(yù)期,本文主要介紹了MySql?字符集不同導(dǎo)致?left?join?慢查詢的問題解決,感興趣的可以了解一下2024-05-05VS2022連接數(shù)據(jù)庫MySQL并進(jìn)行基本的表的操作指南
鑒于MySQL數(shù)據(jù)庫的流行與強(qiáng)大,決定多學(xué)習(xí)使用,下面這篇文章主要給大家介紹了關(guān)于VS2022連接數(shù)據(jù)庫MySQL并進(jìn)行基本的表的操作指南,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05mysql8關(guān)閉binlog并清空Binlog的方法
這篇文章主要介紹了mysql8關(guān)閉binlog并清空Binlog,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09