mysql代碼分析博客(csdn mysql)

本文目錄一覽:

詳解mysql的limit經典用法及優化實例

用法一

複製代碼

代碼如下:

SELECT

`keyword_rank`.*

FROM

`keyword_rank`

WHERE

(advertiserid=’59’)

LIMIT

2

OFFSET

1;

比如這個SQL

,limit後面跟的是2條數據,offset後面是從第1條開始讀取。

用法二

複製代碼

代碼如下:

SELECT

`keyword_rank`.*

FROM

`keyword_rank`

WHERE

(advertiserid=’59’)

LIMIT

2,1;

而這個SQL,limit後面是從第2條開始讀,讀取1條信息。

這兩個千萬別搞混哦。

用法三

複製代碼

代碼如下:

select

*

from

tablename

條件語句

limit

100,-1

從第100條後開始-最後一條的記錄

用法四

複製代碼

代碼如下:

select

*

from

tablename

條件語句

limit

15

相當於limit

0,15

.查詢結果取前15條數據用法五

mysql低版本不支持limit

offset

limit

offset

在mysql

4.0以上的版本中都可以正常運行,在舊版本的mysql

3.23中無效

limit

m

offset

n

等價於

limit

m,n

limit

的優化

mysql的limit給分頁帶來了極大的方便,但數據量一大的時候,limit的性能就急劇下降

來源:一畝三分地博客

MYSQL的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但數據量一大的時候,limit的性能就急劇下降。

同樣是取10條數據

複製代碼

代碼如下:

select

*

from

yanxue8_visit

limit

10000,10

select

*

from

yanxue8_visit

limit

0,10

就不是一個數量級別的。

網上也很多關於limit的五條優化準則,都是翻譯自mysql手冊,雖然正確但不實用。今天發現一篇文章寫了些關於limit優化的,很不錯。

文中不是直接使用limit,而是首先獲取到offset的id然後直接使用limit

size來獲取數據。根據他的數據,明顯要好於直接使用limit。這裡我具體使用數據分兩種情況進行測試。(測試環境win2033+p4雙核

(3GHZ)

+4G內存

mysql

5.0.19)

1、offset比較小的時候。

複製代碼

代碼如下:

select

*

from

yanxue8_visit

limit

10,10

多次運行,時間保持在0.0004-0.0005之間

複製代碼

代碼如下:

Select

*

From

yanxue8_visit

Where

vid

>=(

Select

vid

From

yanxue8_visit

Order

By

vid

limit

10,1

)

limit

10

多次運行,時間保持在0.0005-0.0006之間,主要是0.0006

結論:偏移offset較小的時候,直接使用limit較優。這個顯然是子查詢的原因。

2、offset大的時候。

複製代碼

代碼如下:

select

*

from

yanxue8_visit

limit

10000,10

多次運行,時間保持在0.0187左右

複製代碼

代碼如下:

Select

*

From

yanxue8_visit

Where

vid

>=(

Select

vid

From

yanxue8_visit

Order

By

vid

limit

10000,1

)

limit

10

多次運行,時間保持在0.0061左右,只有前者的1/3。可以預計offset越大,後者越優。

以後要注意改正自己的limit語句,優化一下mysql了

誰推薦一個好的個人博客源碼(PHP+MYSQL)

wordpress 是個比較不錯的,我也用這個 WordPress 是一種使用 PHP 語言和 MySQL 數據庫開發的開源、免費的 Blog(博客,網誌)引擎,用戶可以在支持 PHP 和 MySQL 數據庫的服務器上建立自己的 Blog。 WordPress 是一個功能非常強大的博客系統,插件眾多,易於擴充功能。安裝和使用都非常方便。目前 WordPress 已經成為主流的 Blog 搭建平台。 WordPress 的原版是英文版的,UTF-8 編碼,最新版本為2010年4月3日發佈的 3.0 beta 1。為滿足日益龐大的中文用戶需求開闢了中文官方站點且提供中文版程序下載。還有愛好者開發了中文語言包,使其可以支持中文。不過,由於使用的編碼原因,中文字符截斷時會出現亂碼。不過桑葚網友製作的中文 WordPress 工具箱插件可以解決這個問題。 WordPress 可以說是世界上目前最先進的 weblog 程序。目前開發的程序大多都是根據它仿造的。它更能把握搜索引擎,在你使用 WordPress 並掌握幾種插件後,對於優化將不用過多的操心,它會為你想的更多。 WordPress有許多第三方開發的免費模板,安裝方式簡單易用。不過要做一個自己的模板,則需要你有一定的專業知識。比如你至少要懂的HTML代碼、CSS、PHP等相關知識。

MySQL表連接之驅動表與被驅動表

眾所周知, MySQL的驅動表與被驅動表是優化器自動優化選擇的結果 (與表連接的前後順序等無關),我們可以用explain執行計劃來知曉:

如上所示,前面一行t1是驅動表,後面一行t2是被驅動表。那麼驅動表與被驅動表的選擇是否有規律可循呢?下面是百度搜索兩個主流的博文對驅動表與被驅動表的闡釋:

1. MySQL連接查詢驅動表被驅動表以及性能優化 – 阿偉~ – 博客園 博文A 主要結論:

2. mysql驅動表與被驅動表及join優化_java小小小黑的博客-CSDN博客_mysql驅動表和被驅動表 博文B 其主要結論:

兩個帖子的結論是都差不多,而且還給出了例子來佐證。那麼網上的結論是否權威?是否有普遍性?是否存在缺陷?

讓我們來一起打破砂鍋問到底。下面有兩張表結構一模一樣的表t1,t2:其中t1 100條數據,t2 1000條數據;t1(t2)結構如下:

按照上面博文的結論,left join左邊是t2表,應該是驅動表。我們查看下結果:

與 博文B 中觀點1相違背(同理觀點2也違背),與實際不符,但究竟這是為什麼呢?

下面發一張MySQL的執行過程(來源於《MySQL實戰45講》中01講【一條SQL查詢語句是如何執行的】)

so die si ne,原來sql執行的過程是這樣呀。等等,不對,這跟剛才SQL又有什麼關係,上面left join中t2表還是左邊的呀。

我們知道MySQL高版本的性能越來越好,它是不斷進行優化迭代的。遠古的mysql版本可能還需要人工把小表放在前面,大表放在後面等這些需要人工調優的經驗早就已經被解決了。也就是說我們寫的語句,MySQL為了追求更好的效率,它在執行器執行前已經幫我們優化了。那麼實際優化後的sql如何查看呢?用show warning命令:

其中Message就是優化後實際執行的sql語句,格式化後如下:

優化後left join左連接變成了內連接(inner) join。所以用優化後的sql看,表t1是小表所以作為驅動表,與實際結果相符。

left join 竟然優化成了join,太神奇了,但這是為什麼呢?原因在於mysql中null與任何值做等值或者不等值比較的時候都是null,即使是select null=null 也是null。這樣where 條件t1.a=t2.a查詢條件不會包含t2.a為NULL的行,實際效果其實跟join一樣,被優化器智能的優化了。

我們直接看執行計劃看實際結果吧:

結果顯示t2是驅動表,t1是被驅動表。t2是1000條數據按理說是大表應該是被驅動表,與 博文A , 博文B 的結論又不一致了。

《MySQL實戰45講》中34講【到底可不可以使用join】已經講的很透徹了,很深入了,我就不在這裡獻醜了。啰嗦幾句大概就是驅動表是全表掃描不走索引,所以選被驅動表t1可以走索引,不會全表掃描,減少IO次數,性能高。裏面對大表小表的總結,簡直是精髓,特意在此再次着重強調:

在決定哪個表做驅動表的時候,應該是兩個表按照各自的條件過濾,過濾完成之後,計算參與join的各個字段的總數據量,數據量小的那個表,就是「小表」,應該作為驅動表。

按照上面分析,我們先獨立思考下MySQL會選擇哪張表作為驅動表呢?

表t1,t2在字段a上都有索引不會全表掃描,其中t1.a=5條件過濾後只有一條,很顯然嘛,t1數據量少是小表,肯定是驅動表,錯不了,再說了前面的紅色粗體已經強調了,不會有錯的。

有冇搞錯?事實又被打臉了。還記得在開篇我們說過的mysql優化器會對sql語句進行優化的嗎?下面我們看下執行計劃與優化的sql語句:

格式化後的優化SQL如下:

優化後兩表t1,t2都走索引,並且都只有一條結果返回,因此都只會掃描一行,數據量一樣,所以誰在前面誰就是驅動表,也就是上面sql中表t2。一切都釋然,豁然開通!

回頭再仔細想想,高,實在是高!仔細深思之後MySQL優化後的句子真讓人猛拍大腿。高明之處在於:

1. 本來join連接是個M*N的嵌套循環,優化後變成了M+N的判斷,兩表不再嵌套判斷了。

2. 優化後,兩表沒有多大必然聯繫,只需把兩表的結果集拼接即可,互不干擾。如果mysql未來可以多線程查詢,豈不十分快哉!

小夥伴們還記得我們在上一章 MySQL索引初探 中編碼類型不一致發生隱式轉換時有時候走索引,有時候索引又失效的問題嗎?下面我們選取有代表性的一條記錄來分析:

其中表demo_test總共有640條數據,demo_test_ass有3條數據。顯然經過過濾條件t.rid1完成後demo_test_ass數據量小,應該作為驅動表。雖然test.c_utf8mb4 = t.c2兩字段連接中發生了t.c2字段發生隱式轉換,但是實際上並不影響被驅動表test上的c_utf8mb4索引。

好了,本章到此結束,讓我們一起 總結一下MySQL驅動表與被驅動表的選取原則 :

หน ง 同等條件,優先選取有索引的表作為被驅動表。 在此介紹一下什麼叫同等條件,比如上面的②中的語句。 兩表沒有其他額外的過濾條件,因此選關聯字段有索引的t1作為被驅動表。但是如果加了條件(and t1.id=3),此時t1數據量少,就選取了t2作為被驅動表。

สอง MySQL選擇驅動表與被驅動表是基於優化器優化後的,小表是驅動表,大表是被驅動表。 基於優化器優化後開篇的 博文A與B 結論成立。

當然這都是我一家之言,並不是官方結論,目前暫未找到官方確切對於驅動表與被驅動表的解釋,請大家踴躍拍磚!

java +mysql怎麼樣實現博客的評論功能

java +mysql怎麼樣實現博客的評論功能

1、博客文章有個id,這是文章表

2、評論的時候,把評論寫到評論表裡,同時把被評論的文章id也寫進評論表裡

3、讀取文章的同時再到評論表裡,把這篇文章對於的評論讀出來就行了

用mysql怎麼製作微博或者博客

有很多開源的博客、微博平台

建議你到 開源中國社區 搜 博客

裏面有很多開源平台的介紹

1、DLOG4J 3.0是一個多用戶博客系統

以個人應用為出發點增加包括相冊、音樂、論壇、留言板等功能

增加了好友、黑名單功能

允許設置空間的樣式、布局以及關閉和開啟某些功能,功能個性化命名等

全面引入標籤功能,使包括日記、照片、討論均可使用標籤

支持多種友情鏈接包括:WEB、WAP、RSS、站內等

全功能WAP支持(寫日記、上傳照片、下載音樂、網站管理)

允許設置多個超級管理員對各個空間數據進行管理

全文搜索引擎,使搜索更加人性化

2、Laconica (音”luh-KAWN-ih-kuh”)是一個微型博客系統,類似於twitter和嘰歪網之類的東西

3、JaikuEngine是一個2007年被Google收購的微博客平台。但是今年,Google決定在Google Code上將其完全開源。JaikuEngine能夠部署在Google AppEngine上,所以使用JaikuEngine架設微博客社區可以說是一個完全免費的解決方案,您只需要擁有一個Google帳戶,然後開通AppEngine服務即可。同時JaikuEngine也具有完備的移動設備訪問接口。

mysql中的一些稍微複雜用法實例代碼

前言

mysql的語法相信對大家來說都不是難事,但是本文主要給分享了一些mysql複雜用法的相關內容,通過這篇文章相信大家會對mysql更深的了解一些,下面話不多說了,來一起看看詳細的介紹吧

一對多數據顯示成一行

GROUP_CONCAT(expr)

1、涉及的表關係:teacher表、teacher_subject_rel表(教師所能教的學科表)、subject表

2、業務場景:

需要拉取所有教師的編號(teacher_no)、學科名(subject_name)。

nbsp

教師表(teacher)和學科(teacher_subject_rel)是一對多關係,

往往查詢出現的是同一教師多條

數據。我們希望得到每個教師一條數據

學科拼接成一條

1、基本語法

group_concat(

[DISTINCT]

要連接的字段

[Order

BY

排序字段

ASC/DESC]

[Separator

‘分隔符’]

)

2、例子

SELECT

t.teacher_id

as

‘教師id’,

t.teacher_no

‘教師編號’,

(

SELECT

GROUP_CONCAT(s.subject_name)

FROM

teacher_subject_rel

tsr

LEFT

JOIN

`subject`

s

ON

tsr.subject_id

=

s.subject_id

WHERE

t.teacher_id

=

tsr.teacher_id

)

AS

‘學科’

FROM

teacher

t

子查詢、查詢臨時表、EXISTS

例子

SELECT

*

FROM

(

SELECT

o.id,

o.student_intention_id,

s.

NAME,

s.area_id,

a.area_name,

s.exam_year,

o.

STATUS,

CASE

o.

STATUS

WHEN

‘1’

THEN

‘待提交’

WHEN

‘2’

THEN

‘待指派’

WHEN

‘3’

THEN

‘已完成’

WHEN

‘4’

THEN

‘處理中’

END

statusName,

CASE

o.emergency_degree

WHEN

‘1’

THEN

‘正常’

WHEN

‘2’

THEN

‘緊急’

WHEN

‘3’

THEN

‘非常緊急’

END

emergencyDegreeName,

o.emergency_degree,

o.update_time,

(

SELECT

first_lesson_time

FROM

jx_strategy

WHERE

jx_lesson_plan_order_id

=

o.id

AND

STATUS

IN

(2,

7)

AND

first_lesson_time

now()

ORDER

BY

first_lesson_time

ASC

LIMIT

1

)

AS

first_time,

(

SELECT

deal_user_id

FROM

jx_strategy

WHERE

jx_lesson_plan_order_id

=

o.id

AND

STATUS

7

AND

deal_user_id

ORDER

BY

id

DESC

LIMIT

1

)

AS

deal_user_id

FROM

jx_lesson_plan_order

o

LEFT

JOIN

student

s

ON

s.student_intention_id

=

o.student_intention_id

LEFT

JOIN

area

a

ON

s.area_id

=

a.id

WHERE

o.

STATUS

1

AND

s.phone

=

‘18501665888’

AND

o.emergency_degree

=

1

AND

o.

STATUS

=

2

AND

s.exam_year

=

‘2015’

AND

o.update_time

=

‘2018-08-14

20:28:55′

AND

o.update_time

=

‘2018-08-14

20:28:55′

)

AS

a

WHERE

1

=

1

AND

a.deal_user_id

=

145316

AND

a.first_time

=

‘2018-08-17

00:00:00′

AND

a.first_time

=

‘2018-08-30

00:00:00′

AND

EXISTS

(

SELECT

*

FROM

jx_strategy

js

WHERE

js.jx_lesson_plan_order_id

=

a.id

AND

js.

STATUS

IN

(2,

7)

AND

js.subject_id

IN

(2,

3)

)

ORDER

BY

a.update_time

DESC

LIMIT

0,

10

update

關聯變量條件修改

1、涉及的表關係:

user_info表中的

id_number(身份證號)

teacher表中的birth字段、

關聯關係usrer_id

=

teacher_id

2、業務場景:獲取用戶身份證上的出生日期將出生日期更新在birth字段

UPDATE

teacher

t

INNER

JOIN

(

SELECT

t.teacher_id,

t.birth,

u.id_number,

CONCAT(SUBSTRING(u.id_number,

7,

4),

‘-‘,

SUBSTRING(u.id_number,

11,

2),

‘-‘,

SUBSTRING(u.id_number,

13,

2))

as

birth1,

u.reg_date,

t.exit_time

from

teacher

t

INNER

JOIN

user_info

u

ON

u.user_id

=

t.teacher_id

)

info

on

info.teacher_id

=

t.teacher_id

SET

t.birth

=

info.birth1

WHERE

info.reg_date

‘2018-08-20

00:00:00′

and

info.id_number

is

not

NULL

and

(info.birth

is

NULL

or

t.birth

=

”)

and

t.is_train

=

1

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:MySQL在關聯複雜情況下所能做出的一些優化Mysql一些複雜的sql語句(查詢與刪除重複的行)深入mysql

“ON

DUPLICATE

KEY

UPDATE”

語法的分析MySQL

最基本的SQL語法/語句MySQL與Oracle的語法區別詳細對比淺析Mysql

Join語法以及性能優化MySQL

ALTER語法的運用方法MySQL

prepare語句的SQL語法MySQL進階SELECT語法篇MySQL

SQL

語法參考

原創文章,作者:IMM5C,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/130216.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IMM5C的頭像IMM5C
上一篇 2024-10-03 23:28
下一篇 2024-10-03 23:28

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • 怎麼寫不影響Python運行的長段代碼

    在Python編程的過程中,我們不可避免地需要編寫一些長段代碼,包括函數、類、複雜的控制語句等等。在編寫這些代碼時,我們需要考慮代碼可讀性、易用性以及對Python運行性能的影響。…

    編程 2025-04-29
  • 北化教務管理系統介紹及開發代碼示例

    本文將從多個方面對北化教務管理系統進行介紹及開發代碼示例,幫助開發者更好地理解和應用該系統。 一、項目介紹 北化教務管理系統是一款針對高校學生和教職工的綜合信息管理系統。系統實現的…

    編程 2025-04-29

發表回復

登錄後才能評論