ORACLE MYSQL中join 欄位型別不同索引失效的情況
關於JOIN使用不同型別的欄位型別,資料庫可能進行隱士轉換,MYSQL ORACLE都是如此,
下面使用一個列子來看看,指令碼如下:
mysql:
drop table testjoin1;
drop table testjoin2;
create table testjoin1(id int, name varchar(20));
create table testjoin2(id varchar(20),name varchar(20),key(id);
oracle:
drop table testjoin1;
drop table testjoin2;
create table testjoin1(id int,name varchar2(20));
create table testjoin2(id varchar(20),name varchar2(20));
create index test_id_2 on testjoin2(id);
insert into testjoin1 values(1,'gaopeng');
insert into testjoin1 values(2,'gaopeng');
insert into testjoin1 values(3,'gaopeng');
insert into testjoin1 values(4,'gaopeng');
insert into testjoin1 values(5,'gaopeng');
insert into testjoin2 values('1','gaopeng');
ORACLE中的隱士轉換,
SQL> select /*+ use_nl(a b) ordered */ * from testjoin1 a join testjoin2 b on a.id=b.id ;
ID NAME ID NAME
---------- -------------------- -------------------- --------------------
1 gaopeng 1 gaopeng
Execution Plan
----------------------------------------------------------
Plan hash value: 2498279186
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 49 | 5 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 49 | 5 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| TESTJOIN1 | 5 | 125 | 2 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| TESTJOIN2 | 1 | 24 | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("A"."ID"=TO_NUMBER("B"."ID")) --雖然TESTJOIN2是被驅動表由於隱士轉換索引用不到
mysql> explain select * from testjoin1 a Straight_JOIN testjoin2 b on a.id=b.id ;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
| 1 | SIMPLE | a | NULL | ALL | NULL | NULL | NULL | NULL | 5 | 100.00 | NULL |
| 1 | SIMPLE | b | NULL | ALL | id | NULL | NULL | NULL | 1 | 100.00 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------------------------------------------+
2 rows in set, 3 warnings (0.00 sec)
Warning (Code 1739): Cannot use ref access on index 'id' due to type or collation conversion on field 'id' --雖然TESTJOIN2是被驅動表由於隱士轉換索引用不到 possible_keys可以看出
Warning (Code 1739): Cannot use range access on index 'id' due to type or collation conversion on field 'id'
Note (Code 1003): /* select#1 */ select `test`.`a`.`id` AS `id`,`test`.`a`.`name` AS `name`,`test`.`b`.`id` AS `id`,`test`.`b`.`name` AS `name` from `test`.`testjoin1` `a` straight_join `test`.`testjoin2` `b` where (`test`.`a`.`id` = `test`.`b`.`id`)
MYSQL手冊原文:
To retrieve rows from other tables when performing joins. MySQL can use indexes on columns more
efficiently if they are declared as the same type and size. In this context, VARCHARand CHARare
considered the same if they are declared as the same size. For example, VARCHAR(10)and CHAR(10)
are the same size, but VARCHAR(10)and CHAR(15)are not.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2131608/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql索引失效的情況MySql索引
- Mysql 會導致索引失效的情況MySql索引
- MYSQL索引失效的各種情況小結MySql索引
- 簡單介紹MySQL索引失效的幾種情況MySql索引
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- Laravel 對於 Mysql 欄位string型別查詢,當使用數字對這個欄位進行查詢,PHP弱型別語言導致索引失效LaravelMySql型別PHP索引
- MySQL欄位型別最全解析MySql型別
- Oracle 12.2中的索引統計被呼叫情況Oracle索引
- mysql表操作(alter)/mysql欄位型別MySql型別
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- oracle order by索引是否使用的情況Oracle索引
- Oracle 修改欄位型別和長度Oracle型別
- 關於mysql中欄位定義的型別int、tinyint區別MySql型別
- 盤一盤常見的6種索引失效情況索引
- mysql索引不會命中的情況MySql索引
- MYSQL 字符集不同引起的join無法走索引MySql索引
- MySQL哪些情況需要新增索引?MySql索引
- MySQL索引的型別MySql索引型別
- oracle複合索引介紹(多欄位索引)Oracle索引
- PHP 操作 mysql blob 資料型別的欄位PHPMySql資料型別
- java查詢資料庫,int型欄位為null的情況Java資料庫Null
- Mysql兩種情況下更新欄位中部分資料的方法MySql
- 查詢mysql某張表中的所有資料(欄位)型別MySql型別
- Oracle 計算欄位選擇性 判別列的索引潛力Oracle索引
- JSON欄位型別在ORM中的使用JSON型別ORM
- MYSQL SET型別欄位的SQL操作知識介紹MySql型別
- oracle組合索引什麼情況下生效?Oracle索引
- MySQL中join語句的基本使用教程及其欄位對效能的影響MySql
- 探索MySQL的InnoDB索引失效MySql索引
- MongoDB更改欄位型別MongoDB型別
- MySQL 索引的型別——《高效能MySQL》MySql索引型別
- MySQL 更新同一個表不同欄位MySql
- MySQL VARCHAR型別欄位到底可以定義多長MySql型別
- MySQL null值欄位是否使用索引的總結MySqlNull索引
- sql語句修改欄位型別和增加欄位SQL型別
- 用Elasticsearch做大規模資料的多欄位、多型別索引檢索Elasticsearch多型型別索引
- MySql ORDER BY索引是否失效MySql索引
- sqlsugar 實現實體類中欄位是字串陣列情況SqlSugar字串陣列
- ES Mapping ,1 欄位型別APP型別