最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql數(shù)據(jù)庫(kù)性能優(yōu)化之子查詢

 更新時(shí)間:2017年01月03日 11:48:50   作者:Sniper_ZL  
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)性能優(yōu)化之子查詢的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

記得在做項(xiàng)目的時(shí)候, 聽到過一句話, 盡量不要使用子查詢, 那么這一篇就來看一下, 這句話是否是正確的.

那在這之前, 需要介紹一些概念性東西和mysql對(duì)語(yǔ)句的大致處理.

當(dāng)Mysql Server的連接線程接收到Client發(fā)送過來的SQL請(qǐng)求后, 會(huì)經(jīng)過一系列的分解Parse, 進(jìn)行相應(yīng)的分析, 然后Mysql會(huì)通過查詢優(yōu)化器模塊, 根據(jù)該Sql所涉及到的數(shù)據(jù)表的相關(guān)統(tǒng)計(jì)信息進(jìn)行計(jì)算分析. 然后在得出一個(gè)Mysql自認(rèn)為最合理最優(yōu)化的數(shù)據(jù)訪問方式, 也就是我們常說的"執(zhí)行計(jì)劃", 然后根據(jù)所得到的執(zhí)行計(jì)劃通過調(diào)用存儲(chǔ)引擎接口來獲取相應(yīng)數(shù)據(jù). 再對(duì)存儲(chǔ)引擎返回的數(shù)據(jù)進(jìn)行相關(guān)的處理, 并一Client端所要求的格式作為結(jié)果集, 返回給Client.

注 : 這里所說的統(tǒng)計(jì)數(shù)據(jù), 是我們通過 Analyze table命令通知Mysql對(duì)表的相關(guān)數(shù)據(jù)作分析之后, 所獲取到的一些數(shù)據(jù)統(tǒng)計(jì)量. 這些數(shù)據(jù)對(duì)Mysql優(yōu)化器而言是非常重要的, 優(yōu)化器所生成的執(zhí)行計(jì)劃的好壞, 主要是由這些統(tǒng)計(jì)數(shù)據(jù)所決定的.

1. 建表

create table User(
  Id int not null PRIMARY key auto_increment ,
  NickName varchar(50) comment '用戶昵稱',
  Sex int comment '性別',
  Sign varchar(50) comment '用戶簽名',
  Birthday datetime comment '用戶生日',
  CreateTime datetime comment '創(chuàng)建時(shí)間'
) default charset=utf8 comment '用戶表';

create table UserGroup(
  Id int not null PRIMARY key auto_increment ,
  UserId int not null comment 'user Id',
  GroupId int not null comment '用戶組Id',
  CreateTime datetime comment '創(chuàng)建時(shí)間',
  -- key index_groupid(GroupId) using btree,
  key index_userid(groupid, UserId) using btree
) default charset=utf8 comment '用戶組表';

2. 準(zhǔn)備數(shù)據(jù)

var conStr = ConfigurationManager.ConnectionStrings["ConStr"].ToString();
using (IDbConnection conn = new MySqlConnection(conStr))
{ Stopwatch watch = new Stopwatch();
 var sql = string.Empty;
 var names = new string[] { "非", "想", "紅", "帝", "德", "看", "梅", "插", "兔" };
 Random ran = new Random(); 
 var insertSql = @" insert into User(NickName,Sex,Sign, Birthday, CreateTime) values(@NickName,@Sex,@Sign, @Birthday, @CreateTime); 
 INSERT INTO usergroup (UserId, GroupId, CreateTime ) VALUES (LAST_INSERT_ID() , @GroupId, @CreateTime);";
 watch.Start();
 if (conn.State == ConnectionState.Closed)
 {
  conn.Open();
 }
 var tran = conn.BeginTransaction();
 for (int i = 0; i < 100000; i++)
 {
  var param = new { NickName = names[ran.Next(9)] + names[ran.Next(9)] + i, Sign = names[ran.Next(9)] + names[ran.Next(9)], CreateTime = DateTime.Now, Birthday = DateTime.Now.AddYears(ran.Next(10, 30)), Sex = i % 2, GroupId = ran.Next(1, 100) };
  conn.Execute(insertSql, param, tran);
 }
 tran.Commit();
 conn.Dispose();
 watch.Stop();
 Console.WriteLine(watch.ElapsedMilliseconds);
}

這里我插入了5000條數(shù)據(jù), group分了99個(gè)組, 隨機(jī)的.

3. 查詢sql

 explain
select user.id, user.nickname from usergroup 
left join user on usergroup.UserId = user.Id
where usergroup.groupid = 1 
order by usergroup.UserId desc
limit 100, 20;
 explain
select user.id, user.nickname
from (select id, userid from usergroup where groupid = 1 order by userid limit 100, 20) t
left join user on t.UserId = user.id ;
 explain
select user.id, user.nickname
from (select id, userid from usergroup where groupid = 1 order by userid ) t
left join user on t.UserId = user.id 
limit 100, 20;

第二句和第三句都使用到了子查詢, 不同之處再與, 第二句是先得到20條數(shù)據(jù), 然后以此來與user表關(guān)聯(lián)的

4. 分析

100000條數(shù)據(jù)情況下 :

先看第一句

再看第二句

第三句

從上面三幅圖看, 好像能看出點(diǎn)什么了.

首先看他們的 rows, 第二句最多, 加起來有1000多了, 另兩句加起來都是996. 但是我想說的是, 這里并不是看rows的和是多少. 正確的方式是, 從id大的語(yǔ)句開始看, id相同的語(yǔ)句, 從上到下依次執(zhí)行.

那先看第二句的id=2的語(yǔ)句和第一句的id=1的語(yǔ)句, 一模一樣的. 他們都是從usergroup表中篩選數(shù)據(jù), 并且能得到相同的結(jié)果集A.

看來他們都是基于相同的結(jié)果集去進(jìn)行操作, 接下來就有區(qū)別了.

先看第一句, 再結(jié)果集A的基礎(chǔ)上, 去左連接表user, 并篩選出最后的數(shù)據(jù), 返回給客戶端.

那第二句呢, 是在A的基礎(chǔ)上, 再次篩選數(shù)據(jù), 得到需要的數(shù)據(jù), 然后拿這些數(shù)據(jù), 去與user表左連接, 得到最終結(jié)果.

從上面來看, 執(zhí)行計(jì)劃中, 第二種執(zhí)行計(jì)劃, 更加高效.

 如果能夠通過子查詢, 大幅度縮小查詢范圍, 可以考慮使用子查詢語(yǔ)句.

以上所述是小編給大家介紹的Mysql數(shù)據(jù)庫(kù)性能優(yōu)化之子查詢,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • MySQL如何將CSV文件快速導(dǎo)入MySQL中

    MySQL如何將CSV文件快速導(dǎo)入MySQL中

    有時(shí)候我們可能會(huì)把CSV中的數(shù)據(jù)導(dǎo)入到某個(gè)數(shù)據(jù)庫(kù)的表中,比如做報(bào)表分析的時(shí)候,下面這篇文章主要給大家介紹了關(guān)于MySQL如何將CSV文件快速導(dǎo)入MySQL中的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的步驟

    Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的步驟

    這篇文章主要給大家介紹了關(guān)于Ubuntu 18.04配置mysql以及配置遠(yuǎn)程連接的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • mysql分表之后如何平滑上線詳解

    mysql分表之后如何平滑上線詳解

    項(xiàng)目開發(fā)中,我們的數(shù)據(jù)庫(kù)數(shù)據(jù)越來越大,隨之而來的是單個(gè)表中數(shù)據(jù)太多,以至于查詢書讀變慢,當(dāng)出現(xiàn)這種情況時(shí),我們可以考慮分表,這篇文章主要給大家介紹了關(guān)于mysql分表之后如何平滑上線的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 在Linux環(huán)境下mysql的root密碼忘記解決方法(三種)

    在Linux環(huán)境下mysql的root密碼忘記解決方法(三種)

    這篇文章主要介紹了在Linux環(huán)境下mysql的root密碼忘記解決方法,詳細(xì)的介紹了3種解決辦法,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • mysql實(shí)現(xiàn)定時(shí)備份的詳細(xì)圖文教程

    mysql實(shí)現(xiàn)定時(shí)備份的詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于mysql實(shí)現(xiàn)定時(shí)備份的詳細(xì)圖文教程,我們都知道數(shù)據(jù)是無價(jià),如果不對(duì)數(shù)據(jù)進(jìn)行備份,相當(dāng)是讓數(shù)據(jù)在裸跑,一旦服務(wù)器出問題,只有哭的份了,需要的朋友可以參考下
    2023-07-07
  • MySQL按時(shí)間進(jìn)行表分區(qū)的方法代碼

    MySQL按時(shí)間進(jìn)行表分區(qū)的方法代碼

    本文介紹如何在MySQL中創(chuàng)建按月份分區(qū)的表,并通過修改配置文件或使用數(shù)據(jù)庫(kù)事件來實(shí)現(xiàn)自動(dòng)分區(qū),文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-09-09
  • MySQL百萬級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議

    MySQL百萬級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議

    這篇文章主要介紹了MySQL百萬級(jí)數(shù)據(jù)量分頁(yè)查詢方法及其優(yōu)化建議,幫助大家更好的處理MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-08-08
  • 忘記MySQL的root密碼該怎么辦

    忘記MySQL的root密碼該怎么辦

    忘記密碼總是一件令人頭疼的事情,當(dāng)我們忘記了MySQL的root密碼該怎么辦?本文給出解決方法,感興趣的小伙伴們可以參考一下
    2016-05-05
  • MySQL使用distinct去掉查詢結(jié)果重復(fù)的問題

    MySQL使用distinct去掉查詢結(jié)果重復(fù)的問題

    這篇文章主要介紹了MySQL使用distinct去掉查詢結(jié)果重復(fù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 想取消錯(cuò)誤的mysql命令怎么辦?

    想取消錯(cuò)誤的mysql命令怎么辦?

    今天小編就為大家分享一篇關(guān)于想取消錯(cuò)誤的mysql命令怎么辦?,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評(píng)論

阳东县| 临沂市| 巴林右旗| 屯门区| 上杭县| 尖扎县| 喀喇| 天津市| 阿巴嘎旗| 化德县| 且末县| 洱源县| 星座| 德江县| 华坪县| 麻城市| 吉林市| 阿瓦提县| 巧家县| 项城市| 绥宁县| 盐城市| 无极县| 大埔县| 鄂托克前旗| 洱源县| 连云港市| 同江市| 大荔县| 湖州市| 临夏市| 桐乡市| 南江县| 奉化市| 山丹县| 云和县| 徐闻县| 宜川县| 嘉荫县| 阳新县| 吉隆县|