本文目錄一覽:
- 1、詳解mysql的limit經典用法及優化實例
- 2、誰推薦一個好的個人博客源碼(PHP+MYSQL)
- 3、MySQL表連接之驅動表與被驅動表
- 4、java +mysql怎麼樣實現博客的評論功能
- 5、用mysql怎麼製作微博或者博客
- 6、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