熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

MySQL在有索引列情況下select *的輸出結果順序

2013-11-23 21:06:04  來源: MySQL 

  創建一個表格一個是主鍵列一個是索引列然後插入一批數據調用select * from test_b可以發現輸出結果並沒有按照Id有序而是按照Type有序

  如果希望按照Id有序可以使用force index (primary)這一hint語句

  mysql> CREATE TABLE `test_b` (

  > `Id` int() NOT NULL

  > `Type` int() DEFAULT NULL

  > PRIMARY KEY (`Id`)

  > KEY `IDX_Type` (`Type`)

  > ) ENGINE=InnoDB DEFAULT CHARSET=utf;

  Query OK rows affected ( sec)

  mysql> insert into test_b values()()()()();

  Query OK rows affected ( sec)

  Records: Duplicates: Warnings:

  mysql> select * from test_b;

  +++

  | Id | Type |

  +++

  | | |

  | | |

  | | |

  | | |

  | | |

  +++

   rows in set ( sec)

  mysql> select * from test_b force index (primary);

  +++

  | Id | Type |

  +++

  | | |

  | | |

  | | |

  | | |

  | | |

  +++

   rows in set ( sec)

  觀察select * from test_b的前兩條結果()()當Type相等的時候按照Id排序為了確認這一點再多插入點數據觀察結論相同

  mysql> insert into test_b values()()();

  Query OK rows affected ( sec)

  Records: Duplicates: Warnings:

  mysql> select * from test_b ;

  +++

  | Id | Type |

  +++

  | | |

  | | |

  | | |

  | | |

  | | |

  | | |

  | | |

  | | |

  +++

   rows in set ( sec)

  默認情況下為什麼會結果按照索引列有序呢?這還要從數據庫內部的運行機制說起首先系統會查詢索引表(test_b_indexed_type)該索引表的主鍵是索引列type(通常為了保證主鍵唯一性type後面會添加一個id後綴)通過索引列查到Id然後拿著這些Id去test_b中查詢最終結果為了最高效掃描索引表的時候會順著type主鍵往下掃然後拿掃得的id去“逐個”請求test_b於是自然就出現了按照索引列有序的結果

  當Type列的值一致的時候插入到索引列的數據可以根據Id順序插入到索引表中保證了當Type一致的時候會按照Id排序


From:http://tw.wingwit.com/Article/program/MySQL/201311/29567.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.