欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

當(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大的語句開始看, id相同的語句, 從上到下依次執(zhí)行.

那先看第二句的id=2的語句和第一句的id=1的語句, 一模一樣的. 他們都是從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ì)劃, 更加高效.

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

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

相關(guān)文章

  • MySQL如何快速批量插入1000w條數(shù)據(jù)

    MySQL如何快速批量插入1000w條數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于MySQL如何快速批量插入1000w條數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL需要根據(jù)特定順序排序的實(shí)現(xiàn)方法

    MySQL需要根據(jù)特定順序排序的實(shí)現(xiàn)方法

    在MySQL中,我們可以通過指定順序排序來在查詢結(jié)果中控制數(shù)據(jù)的排列順序,這種排序方式是非常有用的,本文就來介紹一下,感興趣的可以了解一下
    2023-11-11
  • 如何快速修改MySQL用戶的host屬性

    如何快速修改MySQL用戶的host屬性

    這篇文章主要介紹了修改MySQL用戶的host屬性操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • MySQL如何查看正在運(yùn)行的SQL詳解

    MySQL如何查看正在運(yùn)行的SQL詳解

    在項(xiàng)目開發(fā)里面總是要查看后臺(tái)執(zhí)行的sql語句,mysql數(shù)據(jù)庫也不例外,下面這篇文章主要給大家介紹了關(guān)于MySQL如何查看正在運(yùn)行的SQL的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • MySQL增刪查改數(shù)據(jù)表詳解

    MySQL增刪查改數(shù)據(jù)表詳解

    這篇文章主要介紹了MySQL增刪查改數(shù)據(jù)表,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • MySQL數(shù)據(jù)庫約束詳解

    MySQL數(shù)據(jù)庫約束詳解

    mysql常見約束有:1、非空約束“not?null”;2、唯一性約束“unique”;3、主鍵約束“primary?key”;4、外鍵約束“foreign?key”;5、默認(rèn)值約束“Default”等等。
    2022-10-10
  • MySQL實(shí)現(xiàn)MYISAM表批量壓縮的方法

    MySQL實(shí)現(xiàn)MYISAM表批量壓縮的方法

    這篇文章主要介紹了MySQL實(shí)現(xiàn)MYISAM表批量壓縮的方法,實(shí)例分析了MySQL使用shell命令批量壓縮MYISAM表的相關(guān)技巧,需要的朋友可以參考下
    2016-04-04
  • MySQL修改lower_case_table_names參數(shù)的方法實(shí)踐

    MySQL修改lower_case_table_names參數(shù)的方法實(shí)踐

    本文主要介紹了MySQL修改lower_case_table_names參數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復(fù)數(shù)據(jù)

    MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復(fù)數(shù)據(jù)

    這篇文章主要介紹了MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復(fù)數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • MySQL之PXC集群搭建的方法步驟

    MySQL之PXC集群搭建的方法步驟

    PXC 是一套 MySQL 高可用集群解決方案,本文主要介紹了MySQL之PXC集群搭建的方法步驟,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評(píng)論