mysql優化查詢的方式

2022-08-30 12:00:16 字數 3969 閱讀 6172

一、假設有三張表

room

id 1

2..1000user:id1

..10000

booking:

user_id room_id time_id date

1 1 8:00 2017-11-11

1 2 8:00 2017-11-11

1 3 8:00 2017-11-11

1 4 8:00 2017-11-11

1 5 8:00 2017-11-11

二、需求:獲取2017-11-11所有預定資訊:

列印:使用者名稱,會議室名稱, 預定時間段

#

解決方案一:執行11次sql語句

bk = models.booking.objects.filter(date=2017-11-11)

for item in

bk:

print

(item.time_id, item.room.caption, item.user.user)

# 解決方案二:執行1次

bk = models.booking.objects.filter(date=2017-11-11).select_related('

user

','room')

for item in

bk:print

(item.time_id, item.room.caption, item.user.user)

# 解決方案三:執行3次

bk = models.booking.objects.filter(date=2017-11-11).prefetch_related('

user

','room')

for item in

bk:print(item.time_id, item.room.caption, item.user.user)

總結:以後對於sql語句的優化要加上selsect_releated或者prefetch_releated,這只是對於跨表做的優化,如果是單錶的話就沒有必要進行優化查詢了

那麼什麼時候用selsect_releated,什麼時候用prefetch_releated呢?這個按情況而定,

selsect_releated是主動連表,執行一次sql

prefetch_releated不連表執行3次sql

二、q查詢的第二種方式

remove_booking =q()

for room_id, time_id_list in booking_info['

del'

].items():

for time_id in

time_id_list:

temp =q() #例項化乙個q物件

temp.connector = '

and'

#以and的方式連線

#user_id是乙個字段,後面的是乙個字段對應的值

user_id

', request.session['

user_info

']['id'

],))

'booking_date

', booking_date,))

'room_id

', room_id,))

'booking_time

', time_id,))

remove_booking.add(temp, 'or

') #

以or的方式新增到temp

一、假設有三張表

room

id 1

2..1000user:id1

..10000

booking:

user_id room_id time_id date

1 1 8:00 2017-11-11

1 2 8:00 2017-11-11

1 3 8:00 2017-11-11

1 4 8:00 2017-11-11

1 5 8:00 2017-11-11

二、需求:獲取2017-11-11所有預定資訊:

列印:使用者名稱,會議室名稱, 預定時間段

#

解決方案一:執行11次sql語句

bk = models.booking.objects.filter(date=2017-11-11)

for item in

bk:

print

(item.time_id, item.room.caption, item.user.user)

# 解決方案二:執行1次

bk = models.booking.objects.filter(date=2017-11-11).select_related('

user

','room')

for item in

bk:print

(item.time_id, item.room.caption, item.user.user)

# 解決方案三:執行3次

bk = models.booking.objects.filter(date=2017-11-11).prefetch_related('

user

','room')

for item in

bk:print(item.time_id, item.room.caption, item.user.user)

總結:以後對於sql語句的優化要加上selsect_releated或者prefetch_releated,這只是對於跨表做的優化,如果是單錶的話就沒有必要進行優化查詢了

那麼什麼時候用selsect_releated,什麼時候用prefetch_releated呢?這個按情況而定,

selsect_releated是主動連表,執行一次sql

prefetch_releated不連表執行3次sql

二、q查詢的第二種方式

remove_booking =q()

for room_id, time_id_list in booking_info['

del'

].items():

for time_id in

time_id_list:

temp =q() #例項化乙個q物件

temp.connector = '

and'

#以and的方式連線

#user_id是乙個字段,後面的是乙個字段對應的值

user_id

', request.session['

user_info

']['id'

],))

'booking_date

', booking_date,))

'room_id

', room_id,))

'booking_time

', time_id,))

remove_booking.add(temp, 'or

') #

以or的方式新增到temp

優化查詢的方式

一 假設有三張表 room id 1 2.1000user id1.10000booking user id room id time id date 1 1 8 00 2017 11 11 1 2 8 00 2017 11 11 1 3 8 00 2017 11 11 1 4 8 00 2017 ...

查詢優化(MySQL優化查詢)

關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...

mysql統計查詢優化 Mysql查詢優化

效能涉及的層面很多,但是在操作層面,主要有表結構設計優化 索引優化和查詢優化 查詢的生命週期大致可以分為,從客戶端 到服務端 在伺服器上解析 生成執行計畫 執行 返回結果給客戶端 sql執行流程 具體優化技巧 1.消除外連線 2.消除子查詢 盡量用join代替子查詢,雖說mysql查詢優化器會進行優...