最近在優化分頁查詢時,有一個問題:查詢不同列,分頁出來得數據不一樣。先看一下這個現象 表結構: CREATE TABLE `t_attach` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `fname` varchar(100) NOT NULL ...
最近在優化分頁查詢時,有一個問題:查詢不同列,分頁出來得數據不一樣。先看一下這個現象
表結構:
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;
這裡面,有幾個列建立了索引
看一下查詢語句
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 分析一下看看
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
①
②
③
居然用到的key不一樣,類似的情況也可以看下
MySQL 預設排序真的是按主鍵來排序的嗎
可以看出,mysql在不給定order by條件的時候,得到的數據結果的順序是跟查詢列有關的。
因為在不同的查詢列的時候,可能會使用到不同的索引條件。
Mysql在使用不同索引的時候,得到的數據順序是不一樣的。
這個可能就跟Mysql的索引建立機制,以及索引的使用有關了。
可以參考這個看看。
SQL 語句的查詢結果的的順序是由哪些因素決定?
為了避免這種情況,在以後的項目中,切記要加上order by