Mysql 查詢主鍵未指定排序時的預設排序問題

2021-09-24 07:25:07 字數 3304 閱讀 8182

跑批量任務需要分批按順序把主鍵取出來,語句如下:

select id from foo.bar limit 10 offset 0

+-----+

| id |

+-----+

| 109 |

| 13 |

| 14 |

| 15 |

| 128 |

| 129 |

| 130 |

| 190 |

| 226 |

| 227 |

+-----+

複製**

發現雖然用主鍵去查,但結果沒有按照主鍵排序。

查詢*試試

select * from foo.bar limit 10 offset 0

+----+-------+---+

| id | a | b |

+----+-------+---+

| 1 | 24274 | 0 |

| 2 | 24274 | 0 |

| 3 | 24274 | 0 |

| 4 | 24274 | 0 |

| 5 | 24274 | 0 |

| 6 | 24274 | 0 |

| 7 | 24274 | 0 |

| 8 | 24274 | 0 |

| 9 | 24274 | 0 |

| 10 | 24274 | 0 |

+----+-------+---+

複製**

排序按照主鍵。

檢視執行計畫,結果如下:

explain select * from foo.bar limit 10 offset 0 \g

***************************[ 1. row ]***************************

id | 1

select_type | ******

table | bar

partitions | type | all

possible_keys | key | key_len | ref | rows | 211

filtered | 100.0

extra | 複製**

發現select *沒走索引,使用了全表掃瞄,因此順序為主鍵順序。

explain select id from foo.bar limit 10 offset 0 \g

***************************[ 1. row ]***************************

id | 1

select_type | ******

table | bar

partitions | type | index

possible_keys | key | idx_a

key_len | 8

ref | rows | 211

filtered | 100.0

extra | using index

複製**

而select id並沒有用到聚簇索引。innodb二級索引會自動新增主鍵作為索引列最後一項,使用該索引也能做到覆蓋查詢。查詢優化器使用該索引,導致返回的順序不符合預期。

select a,id from foo.bar limit 10 offset 0

+------+-----+

| a | id |

+------+-----+

| 1004 | 109 |

| 1823 | 13 |

| 1823 | 14 |

| 1823 | 15 |

| 1823 | 128 |

| 1823 | 129 |

| 1823 | 130 |

| 1823 | 190 |

| 1823 | 226 |

| 1823 | 227 |

+------+-----+

複製**

發現果然之前select id用的是a的索引,並且是按照a,id的順序排序。

select id from foo.bar force index(pri) limit 10 offset 0

+----+

| id |

+----+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

| 6 |

| 7 |

| 8 |

| 9 |

| 10 |

+----+

複製**

強制使用主鍵索引,果然沒問題了。

explain select id from boss_business.boss_block_refund_order order by id limit 10 offset 0 \g

***************************[ 1. row ]***************************

id | 1

select_type | ******

table | boss_block_refund_order

partitions | type | index

possible_keys | key | primary

key_len | 8

ref | rows | 10

filtered | 100.0

extra | using index

複製**

或者使用order by id引導查詢優化器使用主鍵索引也可以。

另外需要注意,myisam引擎表在沒有任何的刪除、修改操作下,執行select 不帶order by,那麼會按照插入順序進行排序。因為使用myisam儲存引擎的表會把索引資訊另外儲存到乙個稱為索引檔案的另乙個檔案中。總之mysql的查詢優化器一定會傾向於使用最優的方式。

datatable 排序時指定某列不可排序

datatable 是乙個jquery 擴充套件的 外掛程式。其提供了強大的 功能。在官方示例中,對於 的是否可排序是在初始化中設定的乙個值來決定的 js datatable simplified datatable 如果要在初始化時就指定預設以哪一列來排序則 js document ready f...

datatable 排序時指定某列不可排序

datatable是乙個jquery擴充套件的 外掛程式。其提供了強大的 功能。在官方示例中,對於 的是否可排序是在初始化中設定的乙個值來決定的 datatable simplified datatable 如果要在初始化時就指定預設以哪一列來排序則 document ready function ...

MySql查詢結果按照指定順序排序

mysql這功能做的很好用啊!讓查詢結果按照指定順序排序 表結構如下 mysql select from test id name 1 test1 2 test2 3 test3 4 test4 5 test5 執行以下sql mysql select from test where id in 3...