最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

數(shù)據(jù)庫類型轉(zhuǎn)換導(dǎo)致SQL不走索引的案例

 更新時(shí)間:2026年05月20日 10:21:35   作者:瀚高PG實(shí)驗(yàn)室  
在SQL中數(shù)據(jù)類型轉(zhuǎn)換是基礎(chǔ)且關(guān)鍵的操作,分為隱式和顯式轉(zhuǎn)換,隱式轉(zhuǎn)換由系統(tǒng)自動(dòng)完成,雖便捷但可能帶來性能損耗、索引失效及數(shù)據(jù)準(zhǔn)確性風(fēng)險(xiǎn),這篇文章主要介紹了數(shù)據(jù)庫類型轉(zhuǎn)換導(dǎo)致SQL不走索引的案例,需要的朋友可以參考下

環(huán)境

系統(tǒng)平臺(tái):Linux x86-64 Red Hat Enterprise Linux 7

版本:4.5

文檔用途

本文檔主要介紹對字段添加類型轉(zhuǎn)換,會(huì)導(dǎo)致SQL不走索引,從而影響查詢性能。

詳細(xì)信息

表的結(jié)構(gòu)說明

表 table_varchar_id 的字段 id 是 varchar 類型,存在索引 idx_table_varchar_id 。

表 table_int_id 的字段 id 是 bigint 類型,存在索引 idx_table_int_id 。

執(zhí)行計(jì)劃示例

highgo=# EXPLAIN (ANALYZE, BUFFERS)
SELECT v.id as varchar_id, i.id as int_id, v.col1, i.col1
FROM table_varchar_id v
, table_int_id i
WHERE CAST(v.id AS BIGINT) = i.id
AND i.id BETWEEN 100000000000000000 AND 100000000005000000;
                                                                  QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------
 Hash Join  (cost=8.45..586.02 rows=7 width=53) (actual time=0.026..2.209 rows=5 loops=1)
   Hash Cond: ((v.id)::bigint = i.id)
   Buffers: shared hit=418
   ->  Seq Scan on table_varchar_id v  (cost=0.00..515.00 rows=10000 width=32) (actual time=0.004..0.806 rows=10000 loops=1) 
         Buffers: shared hit=415
   ->  Hash  (cost=8.38..8.38 rows=5 width=21) (actual time=0.012..0.012 rows=5 loops=1)
         Buckets: 1024  Batches: 1  Memory Usage: 9kB
         Buffers: shared hit=3
         ->  Index Scan using idx_table_int_id on table_int_id i  (cost=0.28..8.38 rows=5 width=21) (actual time=0.009..0.010 rows=5 loops=1)
               Index Cond: ((id >= '100000000000000000'::bigint) AND (id <= '100000000005000000'::bigint))
               Buffers: shared hit=3
 Planning Time: 0.117 ms
 Execution Time: 2.237 ms
(13 行記錄)

上面執(zhí)行計(jì)劃中,查詢 table_varchar_id 表時(shí),執(zhí)行了順序掃描,沒有使用 id 字段的索引,如下所示:

->  Seq Scan on table_varchar_id v  (cost=0.00..515.00 rows=10000 width=32) (actual time=0.004..0.806 rows=10000 loops=1) 
      Buffers: shared hit=415

原因

SQL語句中對 table_varchar_id 表的字段 id 添加了 CAST(v.id AS BIGINT) 類型轉(zhuǎn)換,導(dǎo)致沒有執(zhí)行 id 字段的索引。

方案

方案一:修改表字段的數(shù)據(jù)類型

針對 table_varchar_id 表的字段 id ,確認(rèn)業(yè)務(wù)上常用的數(shù)據(jù)類型是數(shù)值型還是字符串型,然后統(tǒng)一修改為相同的數(shù)據(jù)類型,示例如下:

highgo=# alter table table_varchar_id alter COLUMN id type bigint using id::bigint;  --統(tǒng)一使用 bigint 類型

highgo=# analyze table_varchar_id;        --收集表的統(tǒng)計(jì)信息,保證被修改數(shù)據(jù)類型的 id 字段的索引立即生效

數(shù)據(jù)類型修改統(tǒng)一后,SQL語句中的 cast 轉(zhuǎn)換可以刪除。

方案二:創(chuàng)建 cast 類型轉(zhuǎn)換的索引

highgo=# create index idx_table_varchar_cast_id on table_varchar_id(cast(id as bigint));

highgo=# analyze table_varchar_id;        --收集表的統(tǒng)計(jì)信息,保證類型轉(zhuǎn)換索引、表達(dá)式索引立即生效

注:類型轉(zhuǎn)換索引、表達(dá)式索引的維護(hù)成本比較高,尤其是數(shù)據(jù)變更頻繁的表,影響性能

方案三:更換為對條件值進(jìn)行類型轉(zhuǎn)換

SQL語句中 table_varchar_id 表的字段 id 去掉 cast 轉(zhuǎn)換,表 table_int_id 的字段 id 作為條件值添加 varchar 類型的轉(zhuǎn)換,修改后的SQL及執(zhí)行計(jì)劃

如下:

highgo=# EXPLAIN (ANALYZE, BUFFERS)
SELECT v.id as varchar_id, i.id as int_id, v.col1, i.col1
FROM table_varchar_id v
, table_int_id i
WHERE v.id = i.id::varchar      --i.id 字段添加 varchar 類型轉(zhuǎn)換,v.id 可以執(zhí)行索引掃描
AND i.id BETWEEN 100000000000000000 AND 100000000005000000;
                                                                   QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=0.57..49.97 rows=5 width=53) (actual time=0.021..0.029 rows=5 loops=1)
   Buffers: shared hit=16 read=2
   ->  Index Scan using idx_table_int_id on table_int_id i  (cost=0.28..8.38 rows=5 width=21) (actual time=0.003..0.004 rows=5 loops=1)
         Index Cond: ((id >= '100000000000000000'::bigint) AND (id <= '100000000005000000'::bigint))
         Buffers: shared hit=3
   ->  Index Scan using idx_table_varchar_id on table_varchar_id v  (cost=0.29..8.31 rows=1 width=32) (actual time=0.004..0.004 rows=1 loops=5)
         Index Cond: ((id)::text = ((i.id)::character varying)::text)
         Buffers: shared hit=13 read=2
 Planning Time: 0.123 ms
 Execution Time: 0.048 ms
(10 行記錄)

總結(jié) 

到此這篇關(guān)于數(shù)據(jù)庫類型轉(zhuǎn)換導(dǎo)致SQL不走索引的文章就介紹到這了,更多相關(guān)類型轉(zhuǎn)換SQL不走索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql中key 、primary key 、unique key 與index區(qū)別

    mysql中key 、primary key 、unique key 與index區(qū)別

    這篇文章主要介紹了mysql中key 、primary key 、unique key 與index區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • MYSQL的select 學(xué)習(xí)筆記

    MYSQL的select 學(xué)習(xí)筆記

    MYSQL的select 學(xué)習(xí)筆記...
    2007-02-02
  • mysql之explain使用詳解(分析索引)

    mysql之explain使用詳解(分析索引)

    在這里對explain的各個(gè)字段進(jìn)行詳細(xì)的分析,來幫助大家分析自己所寫的sql是否最佳的使用了索引,需要的朋友可以參考下
    2018-01-01
  • MySQL聯(lián)結(jié)表介紹以及使用詳解

    MySQL聯(lián)結(jié)表介紹以及使用詳解

    這篇文章主要給大家介紹了關(guān)于MySQL聯(lián)結(jié)表介紹及使用的相關(guān)資料,聯(lián)結(jié)SQL最強(qiáng)大的功能之一就是能在數(shù)據(jù)檢索查詢的執(zhí)行中聯(lián)結(jié)表,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • mysql5.7 新增的json字段類型用法實(shí)例分析

    mysql5.7 新增的json字段類型用法實(shí)例分析

    這篇文章主要介紹了mysql5.7 新增的json字段類型用法,結(jié)合實(shí)例形式分析了mysql5.7 新增的json字段類型具體功能、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • mysql 5.7.17 winx64解壓版安裝配置方法圖文教程

    mysql 5.7.17 winx64解壓版安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.17 winx64解壓版安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • mysql IS NULL使用索引案例講解

    mysql IS NULL使用索引案例講解

    這篇文章主要介紹了mysql IS NULL使用索引案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • navicat?連接Ubuntu虛擬機(jī)的mysql的操作方法

    navicat?連接Ubuntu虛擬機(jī)的mysql的操作方法

    這篇文章主要介紹了navicat?連接Ubuntu虛擬機(jī)的mysql的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • MySql8 WITH RECURSIVE遞歸查詢父子集的方法

    MySql8 WITH RECURSIVE遞歸查詢父子集的方法

    這篇文章主要介紹了MySql8 WITH RECURSIVE遞歸查詢父子集的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • mysql外鍵的三種關(guān)系實(shí)例詳解

    mysql外鍵的三種關(guān)系實(shí)例詳解

    這篇文章主要介紹了mysql外鍵的三種關(guān)系,結(jié)合實(shí)例形式詳細(xì)分析了mysql外鍵多對一、多對多、一對一3種關(guān)系及相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01

最新評論

德令哈市| 桑植县| 南宫市| 石河子市| 玉林市| 平舆县| 靖远县| 北碚区| 舟山市| 将乐县| 邢台县| 南溪县| 视频| 资溪县| 黄山市| 昌吉市| 栾城县| 微博| 广安市| 林甸县| 普格县| 广水市| 松原市| 崇礼县| 油尖旺区| 通化市| 北海市| 留坝县| 乡宁县| 衡阳市| 涟水县| 望城县| 涪陵区| 麻江县| 岳西县| 子洲县| 屏东市| 新宾| 台东县| 青河县| 仲巴县|