[20180408]那些函数索引适合字段的查询.txt

--//一般不主张建立函数索引,往往是开发的无知,使用trunc等函数,实际上一些函数也可以用于字段的查询.
--//以前零碎的写过一些,放假看了https://blog.pythian.com/tackling-time-troubles-use-dates-correctly-oracle/.
--//自己也做一些总结:

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

2.trunc函数:
--//trunc函数是开发最常使用的函数,实际上还是一句话无知,开发根本不知道这样建立查询条件导致普通索引无效,必须建立函数索引.
--//但是建立trunc函数索引却可以使用在普通日期字段的查询.

SCOTT@test01p> create index if_emp_hiredate on emp(trunc(hiredate));
Index created.

SCOTT@test01p> select * from emp where hiredate=to_date('1980/12/17','yyyy-mm-dd');

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  1ct8dum3uyy7u, child number 0
-------------------------------------
select * from emp where hiredate=to_date('1980/12/17','yyyy-mm-dd')
Plan hash value: 4059437819
--------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name            | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                 |        |       |     2 (100)|          |
|*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| EMP             |      1 |    38 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IF_EMP_HIREDATE |      1 |       |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / EMP@SEL$1
   2 - SEL$1 / EMP@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("HIREDATE"=TO_DATE(' 1980-12-17 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
   2 - access("EMP"."SYS_NC00010$"=TRUNC(TO_DATE(' 1980-12-17 00:00:00', 'syyyy-mm-dd hh24:mi:ss')))

--//顺便看看范围查询是否有效:
SCOTT@test01p> select * from emp where hiredate between to_date('1980/12/17','yyyy-mm-dd') and to_date('1980/12/18','yyyy-mm-dd');
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  a00watu79k28f, child number 0
-------------------------------------
select * from emp where hiredate between
to_date('1980/12/17','yyyy-mm-dd') and
to_date('1980/12/18','yyyy-mm-dd')
Plan hash value: 4059437819
--------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name            | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
--------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                 |        |       |     2 (100)|          |
|*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| EMP             |      1 |    38 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IF_EMP_HIREDATE |      1 |       |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / EMP@SEL$1
   2 - SEL$1 / EMP@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(("HIREDATE"<=TO_DATE(' 1980-12-18 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
              "HIREDATE">=TO_DATE(' 1980-12-17 00:00:00', 'syyyy-mm-dd hh24:mi:ss')))
   2 - access("EMP"."SYS_NC00010$">=TRUNC(TO_DATE(' 1980-12-17 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss')) AND "EMP"."SYS_NC00010$"<=TRUNC(TO_DATE(' 1980-12-18 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss')))
--//一样有效.补充11g下执行计划:
SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> select * from emp where hiredate between to_date('1980/12/16 09:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('1980/12/18 10:00:00','yyyy-mm-dd hh24:mi:ss');
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

--//执行计划:

SQL_ID  f532a3utw8dfh, child number 0
-------------------------------------
select * from emp where hiredate between to_date('1980/12/16
09:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('1980/12/18
10:00:00','yyyy-mm-dd hh24:mi:ss')

Plan hash value: 3187737602

------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name            | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                 |        |       |     2 (100)|          |
|*  1 |  TABLE ACCESS BY INDEX ROWID| EMP             |      1 |    46 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IF_EMP_HIREDATE |      1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

1 - SEL$1 / EMP@SEL$1
   2 - SEL$1 / EMP@SEL$1

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(("HIREDATE"<=TO_DATE(' 1980-12-18 10:00:00', 'syyyy-mm-dd hh24:mi:ss')
              AND "HIREDATE">=TO_DATE(' 1980-12-16 09:00:00', 'syyyy-mm-dd hh24:mi:ss')))
   2 - access("EMP"."SYS_NC00009$">=TRUNC(TO_DATE(' 1980-12-16 09:00:00', 'syyyy-mm-dd
              hh24:mi:ss')) AND "EMP"."SYS_NC00009$"<=TRUNC(TO_DATE(' 1980-12-18 10:00:00',
              'syyyy-mm-dd hh24:mi:ss')))

3.substr函数:
--//这个函数非常特殊,你建立的索引必须是substr(col,1,N)的格式,必须是从1开始截取,否则普通字段查询不会使用.这个很好理解.
--//看standard_hash函数后面的例子.

4.standard_hash函数:

--//缺点这个函数12c下才有.以前的测试,重复贴出,不想写了.
--//链接:http://blog.itpub.net/267265/viewspace-772856/
--//到目前为之,我仅仅知道这3个函数可以在普通字段查询时使用.
--//trunc,substr(Col,1,N)还合适范围查询.standard_hash(12c才有的函数)仅仅适合等值查询.

[20130916]12c Indexing Extended Data Types and index.txt

http://richardfoote.wordpress.com/2013/09/12/12c-indexing-extended-data-types-part-i-a-big-hurt/

--//参考以上链接,做一些测试:

1.测试环境:
SCOTT@test01p> @ver
BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SCOTT@test01p> create table bowie (id number, text varchar2(32000));
Table created.

SCOTT@test01p> create index bowie_text_i on bowie(text);
create index bowie_text_i on bowie(text)
                             *
ERROR at line 1:
ORA-01450: maximum key length (6398) exceeded

--//超长字段无法在上建议索引。
--//12c提供standard_hash函数,可以实现其上建立函数索引。

2.插入一些数据,便于测试:
SCOTT@test01p> insert into bowie (id, text) values (1, lpad('a',1110,'a'));
1 row created.

SCOTT@test01p> commit ;
Commit complete.

SCOTT@test01p> select length(text) from bowie;
LENGTH(TEXT)
------------
        1110

SCOTT@test01p> insert into bowie (id, text) select 2, text||text||text||text||text||text||text||text||text||text from bowie;
1 row created.

SCOTT@test01p> commit ;
Commit complete.

SCOTT@test01p> select length(text) from bowie;
LENGTH(TEXT)
------------
        1110
       11100

SCOTT@test01p> insert into bowie (id, text) select rownum+2, to_char(rownum)||'BOWIE' from dual connect by level<=99998;
99998 rows created.

SCOTT@test01p> commit ;
Commit complete.

SCOTT@test01p> exec dbms_stats.gather_table_stats(ownname=>user, tabname=>'BOWIE', method_opt=>'FOR ALL COLUMNS SIZE 1');
PL/SQL procedure successfully completed.

3.建立函数索引:
SCOTT@test01p> create index bowie_hash_text_i on bowie(standard_hash(text));
Index created.

SCOTT@test01p> select index_name, num_rows, leaf_blocks from dba_indexes where index_name = 'BOWIE_HASH_TEXT_I';
INDEX_NAME           NUM_ROWS LEAF_BLOCKS
------------------ ---------- -----------
BOWIE_HASH_TEXT_I      100000         447

4.查询看看情况:
SCOTT@test01p> column text format a100
SCOTT@test01p> select * from bowie where text = '42BOWIE';
        ID TEXT
---------- ---------------------------------------------------
        44 42BOWIE

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  3uz6tby2rv7bh, child number 1
-------------------------------------
select * from bowie where text = '42BOWIE'

Plan hash value: 1900956348

---------------------------------------------------------------------------------------
| Id  | Operation                           | Name              | E-Rows | Cost (%CPU)|
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                   |        |     3 (100)|
|*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE             |      1 |     3   (0)|
|*  2 |   INDEX RANGE SCAN                  | BOWIE_HASH_TEXT_I |      1 |     2   (0)|
---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter((INTERNAL_FUNCTION("TEXT") AND
              INTERNAL_FUNCTION("TEXT")='42BOWIE'))
   2 - access("BOWIE"."SYS_NC00003$"=HEXTORAW('A2C98939EDB479BC3EB0CDC560DDCD15
              75D47F62'))
--可以发现可以使用这个函数索引。

5.但是这种情况存在一些限制,做like 或者between时,不能使用该函数索引:

SCOTT@test01p> select * from bowie where text like 'aaaaaaaaaaaaaaaaaaaaaa%';
...

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
SQL_ID  01fn3bq946un9, child number 0
-------------------------------------
select * from bowie where text like 'aaaaaaaaaaaaaaaaaaaaaa%'

Plan hash value: 1845943507

---------------------------------------------------------
| Id  | Operation         | Name  | E-Rows | Cost (%CPU)|
---------------------------------------------------------
|   0 | SELECT STATEMENT  |       |        |   208 (100)|
|*  1 |  TABLE ACCESS FULL| BOWIE |      1 |   208   (2)|
---------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter((INTERNAL_FUNCTION("TEXT") AND INTERNAL_FUNCTION("TEXT")
              LIKE 'aaaaaaaaaaaaaaaaaaaaaa%'))

SCOTT@test01p> select * from bowie where text between '4299BOWIE' and '42BOWIE';
        ID TEXT
---------- ---------------------------------------------------------------------
        44 42BOWIE
       431 429BOWIE
      4301 4299BOWIE

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  1uk9ud7fq8fdx, child number 0
-------------------------------------
select * from bowie where text between '4299BOWIE' and '42BOWIE'

Plan hash value: 1845943507

---------------------------------------------------------
| Id  | Operation         | Name  | E-Rows | Cost (%CPU)|
---------------------------------------------------------
|   0 | SELECT STATEMENT  |       |        |   208 (100)|
|*  1 |  TABLE ACCESS FULL| BOWIE |      2 |   208   (2)|
---------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter((INTERNAL_FUNCTION("TEXT") AND
              INTERNAL_FUNCTION("TEXT")<='42BOWIE' AND
              INTERNAL_FUNCTION("TEXT")>='4299BOWIE'))

SCOTT@test01p> select * from bowie where text > 'zzz';
no rows selected

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
---------------------------------------------------------------
SQL_ID  39wfprrkz66td, child number 0
-------------------------------------
select * from bowie where text > 'zzz'

Plan hash value: 1845943507

---------------------------------------------------------
| Id  | Operation         | Name  | E-Rows | Cost (%CPU)|
---------------------------------------------------------
|   0 | SELECT STATEMENT  |       |        |   208 (100)|
|*  1 |  TABLE ACCESS FULL| BOWIE |      1 |   208   (2)|
---------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter((INTERNAL_FUNCTION("TEXT") AND
              INTERNAL_FUNCTION("TEXT")>'zzz'))

6.很明显,无法在该列上建议唯一约束。
SCOTT@test01p> alter table bowie add constraint bowie_text_unq unique (text);
alter table bowie add constraint bowie_text_unq unique (text)
*
ERROR at line 1:
ORA-01450: maximum key length (6398) exceeded

--//建立以上约束,需要在该列上建立索引,超长无法建立。同样可以变通的方法建立:

SCOTT@test01p> drop index bowie_hash_text_i;
Index dropped.

SCOTT@test01p> alter table bowie add (text_hash as (standard_hash(text)));
Table altered.

SCOTT@test01p> alter table bowie add constraint bowie_text_unq unique (text_hash);
Table altered.

SCOTT@test01p> insert into bowie (id, text) values (1000001, '42BOWIE');
insert into bowie (id, text) values (1000001, '42BOWIE')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.BOWIE_TEXT_UNQ) violated

--再重复以上查询:
SCOTT@test01p> select * from bowie where text = '42BOWIE';
        ID TEXT     TEXT_HASH
---------- -------- ----------------------------------------
        44 42BOWIE  A2C98939EDB479BC3EB0CDC560DDCD1575D47F62

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  3uz6tby2rv7bh, child number 1
-------------------------------------
select * from bowie where text = '42BOWIE'

Plan hash value: 2691947611

----------------------------------------------------------------------------
| Id  | Operation                   | Name           | E-Rows | Cost (%CPU)|
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |        |     2 (100)|
|*  1 |  TABLE ACCESS BY INDEX ROWID| BOWIE          |      1 |     2   (0)|
|*  2 |   INDEX UNIQUE SCAN         | BOWIE_TEXT_UNQ |      1 |     1   (0)|
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter((INTERNAL_FUNCTION("TEXT") AND
              INTERNAL_FUNCTION("TEXT")='42BOWIE'))
   2 - access("BOWIE"."TEXT_HASH"=HEXTORAW('A2C98939EDB479BC3EB0CDC560DD
              CD1575D47F62'))

--但是如果做范围查询,结果如何应该同上是选择全表扫描。
SCOTT@test01p> select * from bowie where text between '429BOWIE' and '42BOWIE';
        ID TEXT      TEXT_HASH
---------- --------- ----------------------------------------
        44 42BOWIE   A2C98939EDB479BC3EB0CDC560DDCD1575D47F62
       431 429BOWIE  A7E2B59E1429DB4964225E7A98A19998BC3D2AFD

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  143xd3cu22ja1, child number 0
-------------------------------------
select * from bowie where text between '429BOWIE' and '42BOWIE'

Plan hash value: 1845943507

---------------------------------------------------------
| Id  | Operation         | Name  | E-Rows | Cost (%CPU)|
---------------------------------------------------------
|   0 | SELECT STATEMENT  |       |        |   208 (100)|
|*  1 |  TABLE ACCESS FULL| BOWIE |      2 |   208   (2)|
---------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter((INTERNAL_FUNCTION("TEXT") AND
              INTERNAL_FUNCTION("TEXT")<='42BOWIE' AND
              INTERNAL_FUNCTION("TEXT")>='429BOWIE'))

7.如果做范围查询如何显示呢?期待作者的第2部分new extended columns in Part II.
自己也想一下,实际上作者的例子,text组成前面数字+BOWIE。前面5位具有很好的选择性。通过函数substr建立函数应该也可以,
自己测试看看。

SCOTT@test01p> create index i_bowie_text_substr_1_5 on bowie (substr(text,1,5));
Index created.

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  143xd3cu22ja1, child number 0
-------------------------------------
select * from bowie where text between '429BOWIE' and '42BOWIE'

Plan hash value: 1199225668

---------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                    | E-Rows | Cost (%CPU)|
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                         |        |    92 (100)|
|*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE                   |      2 |    92   (0)|
|*  2 |   INDEX RANGE SCAN                  | I_BOWIE_TEXT_SUBSTR_1_5 |    450 |     3   (0)|
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter((INTERNAL_FUNCTION("TEXT") AND INTERNAL_FUNCTION("TEXT")<='42BOWIE'
              AND INTERNAL_FUNCTION("TEXT")>='429BOWIE'))
   2 - access("BOWIE"."SYS_NC00004$">='429BO' AND "BOWIE"."SYS_NC00004$"<='42BOW')

--可以发现使用我建立的索引,看看使用大于的情况呢?
SCOTT@test01p> select * from bowie where text > 'zzz';
no rows selected

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  39wfprrkz66td, child number 0
-------------------------------------
select * from bowie where text > 'zzz'
Plan hash value: 1199225668
---------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                    | E-Rows | Cost (%CPU)|
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                         |        |   181 (100)|
|*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE                   |      1 |   181   (0)|
|*  2 |   INDEX RANGE SCAN                  | I_BOWIE_TEXT_SUBSTR_1_5 |    900 |     4   (0)|
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter((INTERNAL_FUNCTION("TEXT") AND INTERNAL_FUNCTION("TEXT")>'zzz'))
   2 - access("BOWIE"."SYS_NC00004$">='zzz')

--//依旧可以使用我建立的函数索引,但是使用like情况如何呢?

SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  1mq1xczjrz3uw, child number 0
-------------------------------------
select * from bowie where text like 'aaaaaaaaaaaaaaaaaaaaaa%'

Plan hash value: 1845943507

---------------------------------------------------------
| Id  | Operation         | Name  | E-Rows | Cost (%CPU)|
---------------------------------------------------------
|   0 | SELECT STATEMENT  |       |        |   208 (100)|
|*  1 |  TABLE ACCESS FULL| BOWIE |      1 |   208   (2)|
---------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter((INTERNAL_FUNCTION("TEXT") AND INTERNAL_FUNCTION("TEXT")
              LIKE 'aaaaaaaaaaaaaaaaaaaaaa%'))

--//like 无效,不知道作者还有什么好方法,期待作者的第2部分,也许有更好的例子。
--//改写为范围查询也许是一个替换like的方法,但是不适合'%aaaa%'的情况。

SCOTT@test01p>  select * from bowie where text between 'aaaaaaaaaaaaaaaaaaaaaa' and 'aaaaaaaaaaaaaaaaaaaaaa'||chr(255);
SCOTT@test01p> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  bkunhv8x64k0a, child number 1
-------------------------------------
select * from bowie where text between 'aaaaaaaaaaaaaaaaaaaaaa' and
'aaaaaaaaaaaaaaaaaaaaaa'||chr(255)

Plan hash value: 1199225668

---------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                    | E-Rows | Cost (%CPU)|
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                         |        |     2 (100)|
|*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| BOWIE                   |      1 |     2   (0)|
|*  2 |   INDEX RANGE SCAN                  | I_BOWIE_TEXT_SUBSTR_1_5 |      2 |     1   (0)|
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter((INTERNAL_FUNCTION("TEXT") AND
              INTERNAL_FUNCTION("TEXT")>='aaaaaaaaaaaaaaaaaaaaaa' AND
              INTERNAL_FUNCTION("TEXT")<='aaaaaaaaaaaaaaaaaaaaaa?'))
   2 - access("BOWIE"."SYS_NC00004$"='aaaaa')

--//总结:
--//BTW:如果字符字段很长,使用substr函数取前面选择性很强的几位,建立函数索引,有时候不失为一个方法,这样可以减少索引大小,
--//这种方法在10G,11G使用同样有效。
--//12C extended columns中提供的standard_hash函数,作为等值查询,不失为一个很好的选择。

[20180408]那些函数索引适合字段的查询.txt相关推荐

  1. mysql concat键值对_mysql中concat函数实现数据库字段合并查询

    concat()函数是mysql中用来字符类型的字段联合查询的一个不错的函数,但尽量不要使用哦, mysql中怎么合并两个字段为一个字段呢?试了好多方法,结果还是不是我想要的 例如:select (a ...

  2. mysql函数索引_MySQL 函数索引 (Functional indexes)

    函数索引示例: CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1)))); CREATE INDEX idx1 ON t ...

  3. 千呼万唤始出来,MySQL 8.0索引三剑客之函数索引

    MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...

  4. mysql怎样实现先判断后联合_MYSQ创建联合索引,字段的先后顺序,对查询的影响分析...

    MYSQ创建联合索引,字段的先后顺序,对查询的影响分析 前言 对于联合索引我们知道,在使用的时候有一个最左前缀的原则,除了这些呢,比如字段放置的位置,会不会对索引的效率产生影响呢? 最左匹配原则 联合 ...

  5. MySQL创建联合索引,字段的先后顺序,对查询的影响分析

    文章目录 前言 最左匹配原则 为什么会有最左前缀呢? 联合索引的存储结构 联合索引字段的先后顺序 b+树可以存储的数据条数 总结 前言 ​ 对于联合索引我们知道,在使用的时候有一个最左前缀的原则,除了 ...

  6. 对数据库索引的理解及适合建立索引的字段

    因本人小白,总结一下别人总结的,勿怪勿怪.转载深入浅出数据库索引原理,哪些字段适合建立索引 问题 为什么要给表加上主键? 为什么加索引后会使查询变快? 为什么加索引后会使写入.修改.删除变慢? 什么情 ...

  7. mysql建索引 字段截取_提高MySQL索引策略一:隔离查询列

    在mysql中执行查询时,如果没有将查询条件(条件列)隔离出来,那么查询引擎则无法利用建立在该列上的索引进行数据获取.这里的"隔离"意味着查询条件字段不能作为表达式的一部分出现,所 ...

  8. 08--MySQL自学教程:DQL(数据库查询)字段控制查询、聚合函数、分组查询、limit(二)

    DQL数据库查询前四种方法参见: 地址:http://blog.csdn.net/baidu_37107022/article/details/72594234 1.方法概览 一下查询使用queryD ...

  9. mysql 索引查询_mysql索引的建立和查询语句优化

    首先表内容展示: # 300W条的模拟数据 # 并且没有建立任何索引 不建立索引的查询时间: 以id查询的(4秒多): 以email查询的(4秒多): 建立主键索引后: alter table s1 ...

最新文章

  1. Python 之 Pandas (二)选择数据
  2. 精算模型1 一元生存分析3 条件概率与截尾分布
  3. 简单几步教你去除开机出现扫描硬盘!
  4. some VM operation when debugging appointment startup
  5. (翻译)Tricks of the windows game programming Gurus(Windows游戏大师之路) --- 前言(作者:ANDRE LAMOTHE 1999)...
  6. 笔记本windows7设置WIFI教程(超详细)
  7. CentOS4.4下邮件服务器架设笔记之windows AD整合功能实现
  8. 孙鑫VC学习笔记:第十六讲 (二) 利用关键代码段实现线程间的同步
  9. 163邮箱如何开启pop服务器端口,pop3端口号详情介绍
  10. 最难忘的一节计算机课,最难忘的一节课作文(3篇)
  11. 使用Java解牛客网六一儿童节
  12. 5GNR终端理论峰值速率计算
  13. 计算机出现蓝屏怎么解决,电脑出现蓝屏,什么原因,怎么办?
  14. C 语言中负数移位运算讲解
  15. 57q/5oCn5Luj5pWw5Y+K5YW25bqU55So56ysNeeJiOS4reaWh1BERui1hOa6kA==
  16. springmvc后台获取图片,到jsp页面显示
  17. java8 stream 教程_java8 Stream 流快速入门
  18. mysql 中default什么意思_数据库中default的用法正确使用方法
  19. 困惑度、主题一致性,lda模型找出主题相关词
  20. JavaScript之Unicode编码转换小工具

热门文章

  1. JAVA网络编程:TCP/IP数据包结构
  2. C#异步编程模式IAsyncResult概述
  3. Qt地址簿-加个信号及槽
  4. 实现图片预览效果及模糊效果
  5. 银盛通信与深圳邮政达成合作,全城线下代办点突破1000家
  6. 工作流-----WorkFlow
  7. Excel报表配置说明
  8. 数学分析原理 定理 6.4
  9. jQuery学习笔记——jQuery选择器详解种类与方法
  10. .NET简谈组件程序设计之(详解NetRemoting结构)