開發筆記:MySQL的臨時變數及Python的調用方法

來源:互聯網
上載者:User
 我們都知道,如果SQL語句的Where條件中包含了函數運算式,即使條件所引用的列已經有索引,也不一定會使用索引,這是因為,索引只能描述資料的“原 生狀態”(也就是表中的未經處理資料),而不能描述資料經過函數作用之後的狀態(此時資料的分布和聚集情況可能已經變化,索引不再適用)。
有時候,即使我們“知道”經過函數運算之後,索引仍然有用,MySQL也不會“聰明”到這種地步,如此一來,查詢的效率就會急劇下降。
對於某些情況,我們可以使用MySQL的臨時變數,儲存先期計算出的函數運算的結果,再利用這些結果進行進一步查詢,通過explain可以看到,某些情況下,這種措施確實能夠利用索引,提高查詢效率。

MySQL的臨時變數有兩種使用方法:
1.通過Set語句
set @test1 := 0;
set @test2 := @test1 := 5;
select @test1, @test2;
+--------+--------+
| @test1 | @test2 |
+--------+--------+
| 5      | 5      |
+--------+--------+

2.通過Select語句
select @current_time := now();
select @current_time;
+------------------------+
| @current_time|
+------------------------+
| 2007-01-10 11:02:40    |
+------------------------+

通過臨時變數,我們只需要SQL語句就能進行更複雜的查詢(而不需要在資料庫和程式語言之前來回倒資料)。

需要注意的是,MySQL的手冊中提到,MySQL doesn’t evaluate expressions containing user variables until they are sent to the client, 也就是說,包含使用者變數的運算式,在發送給用戶端以前,是不會進行計算的,所以下面的SQL語句可能導致非預期的結果:
SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;
having子句中的b其實引用的是變數@aa,因為SQL語句的執行是非過程化的,我們不能保證@aa的計算會在having子句執行之前(實際上,在MySQL中,b引用的@aa其實是上一次查詢時的@aa的值,而不是針對本次查詢的值)。
要解決這種問題,需要一些更複雜的設定,這裡不多說。

另外還有一點就是,我原本以為,在Python中,把這一組SQL語句用;串連起來,調用cursor.execute(sql),就能得到最後一條語句的結果集,其實並非如此,看情況似乎是,如果cursor.execute(sql)的sql包含分號分隔的多條SQL語句,取得的結果集永遠是空,而且調用一次之後,再調用cursor.execute(sql),會報告:
MySQL error 2013, 'Lost connection to MySQL server during query'(這個問題很怪異)
解決的辦法是,多次調用cursor.execute(),每次執行的參數的均為單條的SQL語句,最後取結果集,這樣就一切正常了。

Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1111607

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.