MYSQL性能調優及架構設計學習筆記-影響MYSQL性能的相關因素之實例分析

需求概述優化

一個簡單的討論區系統,須要有用戶,用戶組,組討論區這三部分基本功能spa

簡要分析ip

1) 需要存放用戶數據的表;ci

2) 需要存放分組信息和用戶與組關係的表;it

3) 需要存放討論信息的表io

 

解決方案table

原始方案一: ast

分別用4個表來存放用戶,用戶組,用戶與組關係,以及各組的討論帖子的信息。email

user用戶表date

Field

Type

Null

Key

Default

Extra

id

int11

NO

 

 

nick_name

varchar(32)

NO

 

NULL

 

password

char(64)

YES

 

NULL

 

email

varchar(32)

NO

 

NULL

 

status

varchar(16)

NO

 

NULL

 

sexuality

char(1)

NO

 

NULL

 

msn

varchar(32)

YES

 

NULL

 

sign

varchar(64)

YES

 

NULL

 

brithday

date

YES

 

NULL

 

hobby

varchar(64)

YES

 

NULL

 

location

varchar(64)

YES

 

NULL

 

description

varchar(1024)

YES

 

NULL

 

 

groups分組表

Field

Type

Null

Key

Default

Extra

id

int11

NO

 

 

gmt_create

datetime

NO

 

NULL

 

gmt_modified

datetime

NO

 

NULL

 

name

varchar(32)

NO

 

NULL

 

status

varchar(16)

NO

 

NULL

 

description

varchar(1024)

YES

 

NULL

 

 

user_group關係表

Field

Type

Null

Key

Default

Extra

user_id

int(11)

NO

MUL

NULL

 

group_id

int(11)

NO

MUL

NULL

 

user_type

int(11)

NO

 

NULL

 

gmt_create

datetime

NO

 

NULL

 

gmt_modified

datetime

NO

 

NULL

 

status

varchar(16)

NO

 

NULL

 


group_message討論組帖子表

Field

Type

Null

Key

Default

Extra

id

int(11)

NO

 

NULL

 

gmt_create

datetime

NO

 

NULL

 

gmt_modified

datetime

NO

 

NULL

 

group_id

int(11)

NO

 

NULL

 

user_id

int(11)

NO

 

NULL

 

subject

varchar(128)

NO

 

NULL

 

content

text

YES

 

NULL

 

 

 

 

 

 

 

 

 

 

優化後方案二以下

user用戶表分紅user用戶表與user_profile

group_message討論組表分紅group_message討論組與group_message_content

user用戶表

Field

Type

Null

Key

Default

Extra

id

int11

NO

 

 

nick_name

varchar(32)

NO

 

NULL

 

password

char(64)

YES

 

NULL

 

email

varchar(32)

NO

 

NULL

 

status

varchar(16)

NO

 

NULL

 

 

user_profile用戶屬性表

Field

Type

Null

Key

Default

Extra

id

int11

NO

 

 

sexuality

char(1)

NO

 

NULL

 

msn

varchar(32)

YES

 

NULL

 

sign

varchar(64)

YES

 

NULL

 

brithday

date

YES

 

NULL

 

hobby

varchar(64)

YES

 

NULL

 

location

varchar(64)

YES

 

NULL

 

description

varchar(1024)

YES

 

NULL

 

 

group_message討論組帖子表

Field

Type

Null

Key

Default

Extra

id

int(11)

NO

 

NULL

 

gmt_create

datetime

NO

 

NULL

 

gmt_modified

datetime

NO

 

NULL

 

group_id

int(11)

NO

 

NULL

 

user_id

int(11)

NO

 

NULL

 

subject

varchar(128)

NO

 

NULL

 

author

varchar(32)

NO

 

NULL

 

 

 

 

 

 

 

 

 

 

group_message_content帖子內容表

Field

Type

Null

Key

Default

Extra

group_msg_id

int11

NO

 

 

content

text

NO

 

NULL

 

 

分析考慮:

1. 從實際出發,一個討論區系統,訪問最多的頁面應該是帖子標題列表頁面。而帖子標題列表頁面最主要的信息都來自於group_message表中,同時帖子標題後面的做者通常都是經過用戶名(暱稱)來展現。所以:

1) 按照第一種解決方案:

SELECT t.id, t.subject, user.id, u.nick_name

FROM

(

SELECT id, user_id, subject

FROM group_message

WHERE group_id = ?

ORDER BY gmt_modified DESC LIMIT 20

) t, user u

WHERE t.user_id = u.id

2) 按照第二種解決方案:

SELECT t.id, t.subject, t.user_id, t.author

FROM group_message t

HWERE group_id = ?

ORDER BY gmt_modified DESC LIMIT 20

   兩個查詢一比較,打攪就能很明顯地看出誰優誰劣了。

2. 因爲第一方案中的group_message 表中還包含一個大字段’content’,該字段存放的信息要佔整個表的絕大部分存儲空間,但在1中表現的最頻繁的Query徹底不須要該字段所存放的信息,因此,形成了Query讀取大量沒有任何意義的數據。所以,須要把content字段單獨分出來存放在group_message_content帖子內容表中。

相關文章
相關標籤/搜索