1. 程式人生 > >MySQL 利用檢視來提高查詢速度

MySQL 利用檢視來提高查詢速度

關於檢視的定義

《SQLite權威指南》是這麼定義的,檢視即是虛擬表,也稱為派生表,因為它們的內容都派生自其它表的查詢結果。雖然檢視看起來感覺和基本表一樣,但是它們部署基本表。基本表的內容是持久的,而檢視的內容是在使用過程中動態產生的。

簡單的理解為,檢視就是通過一條SELECT語句執行後返回的結果集作為視圖表的資料,即create view 視圖表名 as select 語句,是對若干張基本表的引用。

一般視圖表在命名時,會在其中加上view,另外表名通常會有字首(如:tb_或者tbl_),因此,視圖表的字首為(tb_view_或者tbl_view_),然後,後面加上表名(注意:檢視名不能與基本表名一樣)。

為什麼使用檢視呢?

理由有:複雜查詢的需求。我們在定義了一些基本表之後,經常會有一些複雜的關聯查詢,此時,我們就可以將複雜的關聯查詢結果集設定為檢視。對於,應用層來說,檢視的用法和基本表的用法一致。這樣帶來的好處有:複雜關聯語句無需應用層向MySQL資料庫傳送,只要請求請求相應的檢視,除了簡化應用層的開發,還能夠提升查詢速度。

舉個栗子:

建立使用者資訊表:tb_user_center

CREATE TABLE `tb_user_center` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `cuid` int(10) unsigned NOT NULL COMMENT '外部賬號

uid',

  `username` varchar(50) NOT NULL COMMENT '註冊使用者名稱',

  `staff_id` varchar(50) NOT NULL DEFAULT '' COMMENT '工號',

  `mobile` varchar(50) NOT NULL COMMENT '註冊手機號',

  `password` char(32) NOT NULL,

  `email` varchar(200) NOT NULL COMMENT '註冊郵箱',

  `status` tinyint(1) NOT NULL COMMENT '使用者狀態\n0 未稽核\n1 正常\n2 禁用',

  `register_ip` varchar(15) DEFAULT NULL,

  `last_login_time` int(10) NOT NULL DEFAULT '0',

  `last_login_ip` varchar(15) DEFAULT NULL,

  `ctime` int(10) NOT NULL COMMENT '註冊時間',

  `mtime` int(10) NOT NULL COMMENT '修改時間',

  PRIMARY KEY (`id`),

  UNIQUE KEY `unique_username` (`username`),

  KEY `idx_status` (`status`)

) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8 COMMENT='註冊使用者表';

建立授權使用者的表:tb_ssp_member_auth

create table tb_ssp_member_auth(

id int unsigned not null auto_increment comment '主鍵id',

uid int unsigned not null comment '使用者id',

role_id tinyint unsigned not null default '0' comment '使用者角色',

creator int unsigned not null comment '建立者',

auth_app_ids text charset utf8 not null comment '授權應用主鍵id列表,以逗號分隔',

auth_app_names text charset utf8 not null comment '授權應用名稱列表,以逗號分隔',

mtime int unsigned not null comment '修改時間',

ctime int unsigned not null comment '修改時間',

primary key(id),

unique key idx_uid(uid)

)engine innnodb default charset=utf8 collate utf8_bin comment 'ssp媒體授權表';

建立角色表:tb_ssp_member_auth_role

create table tb_ssp_member_auth_role(

id int unsigned not null auto_increment comment '主鍵id',

name varchar(255) not null comment '角色名稱',

creator int unsigned not null default '1' comment '建立者',

note text charset utf8 not null comment '描述',

mtime int unsigned not null comment '修改時間',

ctime int unsigned not null comment '建立時間',

primary key(id)

)engine innodb default charset=utf8 collate utf8_bin comment 'ssp媒體授權角色表';

由於表tb_ssp_member_auth_role中的使用者資訊和角色資訊都是其主鍵id,我們需要管理相應的使用者表和角色表,此時在應用層,需要執行如下MySQL操作:

select a.id, b.username, b.mobile, b.email, c.username as creator, d.name as role, a.auth_app_names as apps, from_unixtime(a.mtime) as mtime, from_unixtime(a.ctime) as ctime FROM  tb_ssp_member_auth a 

left join tb_user_center b on a.uid = b.id 

left join tb_user_center c on a.creator = c.id 

left join tb_ssp_member_auth_role d on a.role_id=d.id;

這個語句左連結了4張表,這裡,我們通過建立視圖表:tb_view_ssp_member_auth,語句如下:

create view tb_view_ssp_member_auth as select a.id, b.username, b.mobile, b.email, c.username as creator, d.name as role, a.auth_app_names as apps, from_unixtime(a.mtime) as mtime, from_unixtime(a.ctime) as ctime FROM  tb_ssp_member_auth a 

left join tb_user_center b on a.uid = b.id 

left join tb_user_center c on a.creator = c.id 

left join tb_ssp_member_auth_role d on a.role_id=d.id;

因此,在下次想查詢tbl_ssp_member_auth表的具體資訊,我們只要查詢視圖表tb_view_ssp_member_auth,示例語句如下:

select * from tb_view_ssp_member_auth;

注意:

檢視是個好東西,特別是對於複雜關聯查詢時,能夠大大簡化應用程式的程式碼。需要特別注意的是對於檢視的更新操作,如果只關聯一張表的時候可以執行更新操作,當關聯多張表時更新操作可能會失敗


相關推薦

MySQL 利用檢視提高查詢速度

關於檢視的定義《SQLite權威指南》是這麼定義的,檢視即是虛擬表,也稱為派生表,因為它們的內容都派生自其它表的查詢結果。雖然檢視看起來感覺和基本表一樣,但是它們部署基本表。基本表的內容是持久的,而檢視的內容是在使用過程中動態產生的。簡單的理解為,檢視就是通過一條SELECT

利用SQL索引提高查詢速度

code 創建索引 nbsp 存儲 test 約束 soft 讀取 select 1.合理使用索引 索引是數據庫中重要的數據結構,它的根本目的就是為了提高查詢效率。現在大多數的數據庫產品都采用IBM最先提出的ISAM索引結構。 索引的使用要恰到好處,其使用原則如下:

Mysql資料量大提高查詢速度

由於在參與的實際專案中發現當mysql表的資料量達到百萬級時,普通SQL查詢效率呈直線下降,而且如果where中的查詢條件較多時,其查詢速度簡直無法容忍。曾經測試對一個包含400多萬條記錄(有索引)的表執行一條條件查詢,其查詢時間竟然高達40幾秒,相信這麼高的查詢延時,任何

mysql通過建立分割槽和索引提高查詢效率

1:建立分割槽 DROP TABLE IF EXISTS `test`; CREATE TABLE test ( id int(10) unsigned NOT NULL AUTO_INCREMENT, time datetime NOT NULL COMMENT '業務時間'

MYSQL處理百萬級以上的資料提高查詢速度的方法

1、應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2、對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 3、應儘量避免在 where 子句中對欄位進行 nu

Oracle 10g中利用雜湊函式提高查詢速度

原文地址:  當資料儲存在一個普通表中的時候,這些記錄將以插入到資料庫時的順序物理地儲存到分配的塊中。例如,如果有一個用於儲存員工資訊的表,那麼員工姓名將會按照插入到表的順序儲存在表中。 如果員工記錄非常多的話,那麼資料表的響應速度就會逐漸變慢。你可以通過選擇值相對等分

處理百萬級以上數據提高查詢速度的方法

pro 需要 存儲空間 and 包括 col sql查詢 意義 調整 1.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的

處理百萬級以上的數據提高查詢速度的方法

大服務 合並行 系統 int read_only raid select 線程數 總數 處理百萬級以上的數據提高查詢速度的方法: 1.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

【轉】使用索引為什麽能提高查詢速度

更多 地址 sga 數據緩沖 同時 list 磁盤 ID 大量數據 為什麽能夠提高查詢速度? 索引就是通過事先排好序,從而在查找時可以應用二分查找等高效率的算法。 一般的順序查找,復雜度為O(n),而二分查找復雜度為O(log2n)。當n很大時,二者的效率相差及其

SQL Server 百萬級資料提高查詢速度的方法

1.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 3.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎

讓mongoDB也能使用in查詢提高查詢速度

mongoDB使用in查詢 在mongoDB查詢,是在springboot中使用的mongoDB,結合業務需求,需要查詢多個ID的記錄,改寫了mongoDB的查詢方法,讓其實現了像MySQL中in查詢

資料庫中,索引的作用?為什麼能夠提高查詢速度?(索引的原理)

為什麼能夠提高查詢速度? 索引就是通過事先排好序,從而在查詢時可以應用二分查詢等高效率的演算法。 一般的順序查詢,複雜度為O(n),而二分查詢複雜度為O(log2n)。當n很大時,二者的效率相差及其懸殊。 舉個例子: 表中有一百萬條資料,需要在其中尋找一

sql處理百萬級以上的資料提高查詢速度的方法

處理百萬級以上的資料提高查詢速度的方法:  1.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。  2.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。  3.應

索引對提高查詢速度的影響

2009-01-06 10:35 456人閱讀 評論(0)收藏舉報 在進行多個表聯合查詢的時候,使用索引可以顯著的提高速度,剛才用SQLite做了一下測試。 建立三個表: create table t1  (id integer primary key, num

php處理百萬級以上的資料提高查詢速度的方法

1、應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。  2、對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。  3、應儘量避免在 where 子句中對欄位進行 n

索引深入理解索引提高查詢速度的原因

1.索引是什麼index索引是幫助資料庫高效獲取資料的資料結構。  是1種資料結構 2.引入索引無論是資料庫查詢資料,還是其他的程式查詢資料利用到的查詢資料必定涉及到相關的查詢演算法。引入:如資料結構的順序表中獲取順序資料一般地我們採用for迴圈來查詢資料此演算法的複雜度為

Q:一個數據表中有大量資料,如何提高查詢速度

一個數據表中有大量資料,如何提高查詢速度? 一、對SQL語句進行優化,主要目的在與讓資料庫引擎使用索引而不是全表掃描進行搜尋 使用索引查詢:應避免造成全表查詢的(索引失效的情況):避免null值查詢。索引列的資料不要大量重複。where語句中or(u

sqlserver重建(rebuild)索引可以提高查詢速度

當隨著表的資料量不斷增長,很多儲存的資料進行了不適當的跨頁(sqlserver中儲存的最小單位是頁,頁是不不可再分的),會產生很多索引的碎片。這時候需要重建索引來提高查詢效能。 如何檢視索引的使用情況: SELECT index_type_desc,alloc_unit_t

處理百萬級以上的資料提高查詢速度的方法(轉)

處理百萬級以上的資料提高查詢速度的方法:  1.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。  2.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。  3.應儘

什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?

為什麼能夠提高查詢速度? 索引就是通過事先排好序,從而在查詢時可以應用二分查詢等高效率的演算法。 一般的順序查詢,複雜度為O(n),而二分查詢複雜度為O(log2n)。當n很大時,二者的效率相差及其懸殊。 舉個例子: 表中有一百萬條資料,需要在其中尋找一條特定id的資料