国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL 一個特殊的難題

2024-07-24 12:31:44
字體:
供稿:網(wǎng)友
        通過a進(jìn)行過濾的數(shù)據(jù)和通過a和b過濾的數(shù)據(jù)條數(shù)一樣,如果要通過索引訪問數(shù)據(jù)select * from table where id1=1 和 select * from table where id1=1 and id2=10 是不是效率一致?
 
        簡易分析
 
       首先對于數(shù)據(jù)查找,首先第一步是進(jìn)行innodb層數(shù)據(jù)的定位(也就是從什么位置開始輸出數(shù)據(jù)給MySQL層),然后定位完成后,順序向下訪問就行了,因?yàn)閕nnodb 的表示一個索引組織表。
 
       - 對于等值條件,Innodb層會多訪問下一條數(shù)據(jù),如果不符合要求了則表示結(jié)束了,會返回一個DB_RECORD_NOT_FOUND標(biāo)記給MySQL層表示結(jié)束。
 
       - 對于 范圍 比如 >  and < 操作如果使用了索引,那么<操作要么在MySQL層進(jìn)行判斷結(jié)束,要買使用ICP在Innodb做一層過濾。
 
      對于數(shù)據(jù)定位后的順序訪問而言,沒有什么差別。
 
因此這個問題主要的問題轉(zhuǎn)換為, a=* 和 a=* and b=* 在進(jìn)行數(shù)據(jù)定位的時候效率是否一致,對于這個問題來講因?yàn)閍=* 和 a=* and b=* 返回的數(shù)據(jù)是一樣。所謂數(shù)據(jù)定位找到數(shù)據(jù)返回的起點(diǎn)在什么地方,這個過程一般會通過B+數(shù)定位到葉子節(jié)點(diǎn),然后根據(jù)在葉子節(jié)點(diǎn)內(nèi)部使用二分法進(jìn)行比較,加速定位,比較的方法就是根據(jù)字段個數(shù)逐個比較(函數(shù)cmp_dtuple_rec_with_match_bytes),比如a=* 那么需要比較就是一個,如果a=* and b=* 那么比較的字段就是2個。
 
代碼大概的棧
 
```
 
->row_search_mvcc
 
  ->btr_pcur_open_with_no_init_func
 
    -> btr_cur_search_to_nth_level
 
      -> page_cur_search_with_match_bytes
 
        -> cmp_dtuple_rec_with_match_bytes
 
```
 
cmp_dtuple_rec_with_match_bytes 這部分注釋如下:
 
```
 
/* Match fields in a loop; stop if we run out of fields in dtuple
 
or find an externally stored field */
 
while (cur_field < n_cmp) {
 
```
 
n_cmp就是需要比較的個數(shù)。
 
debug 記錄:
 
```
 
a=*記錄
 
829             ut_ad(n_cmp <= dtuple_get_n_fields(dtuple));
 
(gdb) n
 
830             ut_ad(cur_field <= n_cmp);
 
(gdb) p n_cmp
 
$4 = 1
 
a=* and b=* 記錄
 
829             ut_ad(n_cmp <= dtuple_get_n_fields(dtuple));
 
(gdb) n
 
830             ut_ad(cur_field <= n_cmp);
 
(gdb) p n_cmp
 
$5 = 2
 
```
 
因此結(jié)論:如果這種特殊情況下,我認(rèn)為效率應(yīng)該基本一致,僅僅區(qū)別就在于定位比較的時候使用字段的多少,但這不會是語句的最大性能耗用點(diǎn),最大的應(yīng)該是循環(huán)訪問所有的字段和通過主鍵回表。因此盡量寫自己需要的字段。

(編輯:武林網(wǎng))

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 梓潼县| 文水县| 全椒县| 镇沅| 涿鹿县| 兴和县| 厦门市| 新田县| 黄平县| 乃东县| 赞皇县| 开原市| 梁河县| 滦南县| 万载县| 扎鲁特旗| 积石山| 闵行区| 西乡县| 阜平县| 苏州市| 仪征市| 滕州市| 正阳县| 安化县| 会泽县| 安塞县| 横峰县| 招远市| 交口县| 开远市| 湖南省| 英吉沙县| 郧西县| 普洱| 长丰县| 南昌县| 驻马店市| 布拖县| 陆河县| 禹州市|