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

MySQL中join語句的基本使用教程及其字段對性能的影響

 更新時間:2015年12月16日 10:49:39   作者:fengyqf  
這篇文章主要介紹了MySQL中join語句的基本使用及其字段對性能的影響,舉了實例來觀測join所作用的不同字段字符集編碼所造成的性能差異,需要的朋友可以參考下

join語句的基本使用

SQL(MySQL) JOIN 用于根據(jù)兩個或多個表中的字段之間的關系,從這些表中得到數(shù)據(jù)。

JOIN 通常與 ON 關鍵字搭配使用,基本語法如下:

... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona
table1 通常稱為左表,table2 稱為右表。ON 關鍵字用于設定匹配條件,用于限定在結果集合中想要哪些行。如果需要指定其他條件,后面可以加上 WHERE 條件 或者 LIMIT 以限制記錄返回數(shù)目等。

下面以最常見的兩表連接來說明 MySQL JOIN 的用法,關于多表 JOIN 請參見《MySQL JOIN 多表》。

MySQL JOIN 分類

JOIN 按照功能大致分為如下三類:

  1. INNER JOIN(內連接):取得兩個表中存在連接匹配關系的記錄。
  2. LEFT JOIN(左連接):取得左表(table1)完全記錄,即是右表(table2)并無對應匹配記錄。
  3. RIGHT JOIN(右連接):與 LEFT JOIN 相反,取得右表(table2)完全記錄,即是左表(table1)并無匹配對應記錄。

關于 MySQL FULL JOIN 全連接

MySQL 沒有提供 SQL 標準中的 FULL JOIN(全連接):兩個表記錄都取出,而不管彼此是否有對應記錄。要解決此問題,可以使用 UNION 關鍵字來合并 LEFT JOIN 與 RIGHT JOIN,達到模擬 FULL JOIN 的目的。

MySQL INNER JOIN

INNER JOIN 用于取得兩個表中存在連接匹配關系的記錄。下面是兩個原始數(shù)據(jù)表:

20151216104417019.png (366×317)

article 表中文章的所屬用戶是通過 uid 這個字段與 user 表關聯(lián)起來的。通過觀察數(shù)據(jù)不難發(fā)現(xiàn),對于 uid=3 的用戶,并沒有發(fā)表任何文章;而文章中 aid=4 卻無法在 uid 表中找到對應記錄(可能是該用戶被刪除而其所屬的文章卻被保留了下來)。

我們列出所用文章與用戶一一對應的數(shù)據(jù)。

SELECT … INNER JOIN … ON 語句如下:

SELECT article.aid,article.title,user.username FROM article INNER JOIN user ON article.uid = user.uid

返回查詢結果如下:

20151216104447947.png (273×126)

對于 INNER JOIN,等同與下面的 SQL 語句:

SELECT article.aid,article.title,user.username FROM article,user WHERE article.uid = user.uid

CROSS JOIN

CROSS JOIN 即交叉連接,在不指定 ON 條件下:

SELECT article.aid,article.title,user.username FROM article CROSS JOIN user

得到的結果是被連接的兩個數(shù)據(jù)表的乘積,即笛卡爾積。

實際上,在 MySQL 中(僅限于 MySQL) CROSS JOIN 與 INNER JOIN 的表現(xiàn)是一樣的,在不指定 ON 條件得到的結果都是笛卡爾積,反之取得兩個表完全匹配的結果。

INNER JOIN 與 CROSS JOIN 可以省略 INNER 或 CROSS 關鍵字,因此下面的 SQL 效果是一樣的:

平板視圖打???

... FROM table1 INNER JOIN table2

... FROM table1 CROSS JOIN table2

... FROM table1 JOIN table2


join的字段字符集編碼對性能的影響

先來看一下示例代碼:

建utf-8編碼的表 t1:

CREATE TABLE IF NOT EXISTS `t1` (
 `name` varchar(50) NOT NULL DEFAULT '',
 KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

隨便插入些數(shù)據(jù),數(shù)量大一點,后面實驗結果更清晰,偷個懶,構造隨機字符串插入語句

insert into t1(name) 
select concat(
char(round((rand())*25)+97),
char(round((rand())*25)+65),
char(round((rand())*25)+65),
char(round((rand())*25)+97),
char(round((rand())*25)+65),
char(round((rand())*25)+65),
char(round((rand())*25)+97),
char(round((rand())*25)+65)
)

每次執(zhí)行插入一條記錄,用你熟悉的腳本(python,php,shell等都行)寫個循環(huán),執(zhí)行一萬次以上。

將該表復制成一個新表t2,刪除一部分數(shù)據(jù),1000條左右即可。(推薦使用phpMyAdmin)

再將t2復制為t3,并將字段改為gb2312編碼。

使用一個left join語句,寫一個語句,查出t2/t3比t1少了哪些記錄。

語句很簡單,如下:

SELECT SQL_NO_CACHE t1.name, t2.name
FROM t1
LEFT JOIN t2 ON t1.name = t2.name
WHERE t2.name IS NULL 
LIMIT 0 , 30

注意加入 SQL_NO_CACHE ,禁用mysql緩存。

先看編碼一致的t2表,phpMyAdmin里執(zhí)行結果:

顯示行 0 - 29 ( 1,129 總計, 查詢花費 0.0010 秒)
平均耗時大概為0.0010秒

SELECT SQL_NO_CACHE t1.name, t3.name
FROM t1
LEFT JOIN t3 ON t1.name = t3.name
WHERE t2.name IS NULL 
LIMIT 0 , 30

phpMyAdmin執(zhí)行結果:

顯示行 0 - 29 ( 30 總計, 查詢花費 0.1871 秒)
差兩個數(shù)量級!

查詢語句解釋:

20151216104614308.png (697×497)

相關文章

  • MySQL性能優(yōu)化的一些技巧幫助你的數(shù)據(jù)庫

    MySQL性能優(yōu)化的一些技巧幫助你的數(shù)據(jù)庫

    你完成了你的品牌新的應用程序,一切工作就像一個魅力;突然間,一個大爆發(fā)的用戶你的MySQL服務器,您的網(wǎng)站已關閉,是什么問題導致的呢?以下是MySQL性能優(yōu)化的一些技巧,將幫助你,幫助你的數(shù)據(jù)庫
    2013-01-01
  • 解說mysql之binlog日志以及利用binlog日志恢復數(shù)據(jù)的方法

    解說mysql之binlog日志以及利用binlog日志恢復數(shù)據(jù)的方法

    下面小編就為大家?guī)硪黄庹fmysql之binlog日志以及利用binlog日志恢復數(shù)據(jù)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • php下巧用select語句實現(xiàn)mysql分頁查詢

    php下巧用select語句實現(xiàn)mysql分頁查詢

    mysql分頁查詢是我們經(jīng)常見到的問題,那么應該如何實現(xiàn)呢?下面就教您一個實現(xiàn)mysql分頁查詢的好方法,供您參考學習。
    2010-12-12
  • mysql 8.0.12 winx64詳細安裝教程

    mysql 8.0.12 winx64詳細安裝教程

    這篇文章主要為大家詳細介紹了mysql 8.0.12 winx64詳細安裝配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 基于Php mysql存儲過程的詳解

    基于Php mysql存儲過程的詳解

    本篇文章是對Php中的mysql存儲過程進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • mysql刪除字段的基本語法和示例

    mysql刪除字段的基本語法和示例

    在MySQL中,使用ALTER?TABLE語句配合DROP?COLUMN子句可以刪除表中的某個字段,示例中,從employees表中刪除email字段,此操作會永久刪除該字段的數(shù)據(jù),因此需提前備份,需要的朋友可以參考下
    2024-09-09
  • mysql-8.0.15-winx64 使用zip包進行安裝及服務啟動后立即關閉問題

    mysql-8.0.15-winx64 使用zip包進行安裝及服務啟動后立即關閉問題

    這篇文章主要介紹了mysql 使用zip包進行安裝以及服務啟動后立即關閉問題 ,本實例使用的mysql版本為mysql-8.0.15-winx64,需要的朋友可以參考下
    2019-05-05
  • MySQL8.0.21安裝步驟及出現(xiàn)問題解決方案

    MySQL8.0.21安裝步驟及出現(xiàn)問題解決方案

    這篇文章主要介紹了MySQL8.0.21安裝步驟及出現(xiàn)問題解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 如何保護MySQL中重要數(shù)據(jù)的方法

    如何保護MySQL中重要數(shù)據(jù)的方法

    在日常的工作中,保護數(shù)據(jù)免受未授權用戶的侵犯是系統(tǒng)管理員特別關心的問題。如果你目前用的是MySQL,就可以使用一些方便的功能來保護系統(tǒng),來大大減少機密數(shù)據(jù)被未授權用戶訪問的風險
    2011-10-10
  • MySQL中binlog+dump備份還原詳細教程

    MySQL中binlog+dump備份還原詳細教程

    MySQL備份是指將MySQL數(shù)據(jù)庫中的數(shù)據(jù)進行備份,以便在需要的時候能夠恢復數(shù)據(jù),下面這篇文章主要給大家介紹了關于MySQL中binlog+dump備份還原的相關資料,需要的朋友可以參考下
    2023-05-05

最新評論

奎屯市| 简阳市| 福泉市| 利川市| 镇坪县| 五峰| 库伦旗| 平罗县| 太谷县| 呼伦贝尔市| 怀安县| 邢台市| 公安县| 临城县| 巢湖市| 马边| 中卫市| 延边| 永济市| 时尚| 云梦县| 通州区| 达州市| 绥棱县| 灯塔市| 梁平县| 民勤县| 周宁县| 岚皋县| 茌平县| 兴海县| 阿合奇县| 永福县| 屏东县| 玛多县| 常德市| 全州县| 南涧| 南汇区| 多伦县| 福安市|