日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

正确高效使用数据库不可不知的索引失效问题

發布時間:2025/7/14 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正确高效使用数据库不可不知的索引失效问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

where語句中索引獨立出現,索引才會起作用,不要放在表達式中(如: 轉換函數一般放在值那邊,不要放在列那邊),或發生不合適的隱式轉換

?

1.表達式例子

表employees的last_name列上有個索引
下面的語句使用索引
SQL> set autotrace trace exp
SQL> SELECT last_name, job_id, department_id
? 2? FROM?? employees
? 3? WHERE? last_name = 'Whalen';

但是下面的語句不使用索引
SQL> set autotrace trace exp
SQL> SELECT last_name, job_id, department_id
? 2? FROM?? employees
? 3? WHERE? lower(last_name) = 'whalen';

?

2.隱式轉換

建立演示表test,在test的employee_id列建有索引
SQL> spool off
SQL> create table test as select * from employees;
表已創建。
SQL> create index i_test_id on test(employee_id);
索引已創建。
SQL> set autotrace trace exp
SQL> select * from test where employee_id='24000';

將列employees的類型由原來的整型修改為字符型,目的是然列employees發生隱式轉換
SQL> truncate table test;
表被截斷。
SQL> alter table test modify(employee_id varchar2(20));
表已更改。
SQL> insert into test select * from employees;
已創建107行。
SQL> commit;
提交完成。
SQL> set autotrace trace exp
SQL> select * from test where employee_id=100;

在上圖中發生了一個隱式轉換TO_NUMBER("EMPLOYEE_ID")
解決方法:轉換函數一般放在值那邊,不要放在列那邊,因為在列那邊會隱士轉換,或其他原因,造成索引失效

SQL> select * from test where employee_id=to_char(100);

?

表employee列salary是NUMBER類型
SQL> select? * from? employee where? salary? like ‘13___’;
系統做了隱士準換 where? to_char(salary) like ‘13__’,則索引失效

?

3.索引實際應用之編碼設計

根據需求來作編碼,例如按一般的邏輯地區編碼為省、市、縣
但是系統中實際上大量查詢是 like ‘%某一個市%‘,這樣索引就失效
所以合適的編碼是市、省、縣 這樣 like ‘某一個市%‘,索引就不會失效了

轉載于:https://www.cnblogs.com/simplefrog/archive/2012/07/15/2592527.html

總結

以上是生活随笔為你收集整理的正确高效使用数据库不可不知的索引失效问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。