最近在優化分頁查詢時,有一個問題:查詢不一樣列,分頁出來得數據不同。先看一下這個現象mysql
表結構:web
CREATE TABLE `t_attach` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `fname` varchar(100) NOT NULL DEFAULT '', `ftype` varchar(50) DEFAULT '', `fkey` text NOT NULL, `authorId` int(10) DEFAULT NULL, `created` int(10) NOT NULL, `hash` varchar(255) DEFAULT NULL, `web_url` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fname` (`fname`) USING BTREE, KEY `created` (`created`) USING BTREE, KEY `web_url` (`web_url`) USING BTREE, KEY `authorId` (`authorId`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=323466 DEFAULT CHARSET=utf8;
這裏面,有幾個列創建了索引sql
看一下查詢語句segmentfault
SELECT * FROM t_attach LIMIT 10,10; SELECT id,fname FROM t_attach LIMIT 10,10; SELECT id FROM t_attach LIMIT 10,10
好奇怪,竟然查詢到的數據不是一致的。想了很久,應該是mysql排序的方式不一致致使的。優化
接着執行了一下EXPLAIN 分析一下看看url
EXPLAIN SELECT * FROM t_attach LIMIT 10,10; EXPLAIN SELECT id,fname FROM t_attach LIMIT 10,10; EXPLAIN SELECT id FROM t_attach LIMIT 10,10
①spa
②3d
③code
竟然用到的key不同,相似的狀況也能夠看下blog
能夠看出,mysql在不給定order by條件的時候,獲得的數據結果的順序是跟查詢列有關的。
由於在不一樣的查詢列的時候,可能會使用到不一樣的索引條件。
Mysql在使用不一樣索引的時候,獲得的數據順序是不同的。
這個可能就跟Mysql的索引創建機制,以及索引的使用有關了。
能夠參考這個看看。
爲了不這種狀況,在之後的項目中,切記要加上order by