程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 做您身邊的技術顧問,您還有什麼懂嗎?

做您身邊的技術顧問,您還有什麼懂嗎?

編輯:關於MYSQL數據庫

這時我把userid加入索引:

create index userid on imgs (userid);

然後再檢查:

MySQL> desc select * from imgs where userid="7mini" order by clicks desc limit 10;
+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+
| 1 | simple | imgs | ref | userid | userid | 51 | const | 8 | using where; using filesort |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)

嗯,這時可以看到MySQL使用了userid這個索引搜索了,用userid索引一次搜索後,結果集有8條。然後雖然使用了filesort一條一條排序,但是因為結果集只有區區8條,效率問題得以緩解。

但是,如果我用別的userid查詢,結果又會有所不同:

MySQL> desc select * from imgs where userid="admin" order by clicks desc limit 10;
+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+
| 1 | simple | imgs | ref | userid | userid | 51 | const | 2944 | using where; using filesort |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)

這個結果和userid="7mini"的結果基本相同,但是MySQL用userid索引一次搜索後結果集的大小達到2944條,這2944條記錄都會加入內存進行filesort,效率比起7mini那次來說就差很多了。這時可以有兩種辦法可以解決,第一種辦法是再加一個索引和判斷條件,因為我只需要根據點擊量取最大的10條數據,所以有很多數據我根本不需要加進來排序,比如點擊量小於10的,這些數據可能占了很大部分。

我對clicks加一個索引,然後加入一個where條件再查詢:

create index clicks on imgs(clicks);

MySQL> desc select * from imgs where userid="admin" order by clicks desc limit 10;
+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+
| 1 | simple | imgs | ref | userid,clicks | userid | 51 | const | 2944 | using where; using filesort |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)

這時可以看到possible_keys變成了userid,clicks,possible_keys是可以匹配的所有索引,mysql會從possible_keys中自己判斷並取用其中一個索引來執行語句,值得注意的是,mysql取用的這個索引未必是最優化的。這次查詢mysql還是使用userid這個索引來查詢的,並沒有按照我的意願,所以結果還是沒有什麼變化。改一下sql加上use index強制MySQL使用clicks索引:

MySQL> desc select * from imgs use index (clicks) where userid='admin' and clicks>10 order by clicks desc limit 10
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
| 1 | simple | imgs | range | clicks | clicks | 4 | null | 5455 | using where |
+----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
1 row in set (0.00 sec)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved