InnoDB
InnoDBInnoDB
InnoDB
InnoDB
InnoDB
/*! */
SELECT
SELECTCREATE
        TABLE...AS SELECTINSERT
        INTO...SELECTDELETE
SELECT ... WHEREWHERE
EXPLAINSELECT
ANALYZE TABLE
InnoDB
InnoDB
EXPLAINEXPLAIN
InnoDBMyISAM
WHERESELECTDELETEUPDATE
((a AND b) AND c OR (((a AND b) AND (c AND d)))) -> (a AND b AND c) OR (a AND b AND c AND d)
(a<b AND b=c) AND a=5 -> b>5 AND b=c AND a=5
(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6) -> B=5 OR B=6
COUNT(*)MyISAMNOT NULL
SELECT
WHERE
WHEREUNIQUE
SELECT * FROM t WHEREprimary_key=1; SELECT * FROM t1,t2 WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
ORDER BY
ORDER BYORDER BY
SQL_SMALL_RESULT
HAVING
SELECT COUNT(*) FROMtbl_name; SELECT MIN(key_part1),MAX(key_part1) FROMtbl_name; SELECT MAX(key_part2) FROMtbl_nameWHEREkey_part1=constant; SELECT ... FROMtbl_nameORDER BYkey_part1,key_part2,... LIMIT 10; SELECT ... FROMtbl_nameORDER BYkey_part1DESC,key_part2DESC, ... LIMIT 10;
SELECTkey_part1,key_part2FROMtbl_nameWHEREkey_part1=val; SELECT COUNT(*) FROMtbl_nameWHEREkey_part1=val1ANDkey_part2=val2; SELECTkey_part2FROMtbl_nameGROUP BYkey_part1;
SELECT ... FROMtbl_nameORDER BYkey_part1,key_part2,... ; SELECT ... FROMtbl_nameORDER BYkey_part1DESC,key_part2DESC, ... ;
range
WHERE
WHERE
SELECT * FROM T1的地方 key_col> 1 key_col< 10;SELECT * FROM t1 WHEREkey_col= 1 ORkey_col在(15,18,20);选择*从T1的地方 key_col像“AB %”或 key_col“酒吧”和“foo”; 
WHERE
key1
SELECT * FROM t1 WHERE (key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR (key1 < 'bar' AND nonkey = 4) OR (key1 < 'uux' AND key1 > 'z');
key1
WHERE
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR(key1 < 'bar' AND nonkey = 4) OR(key1 < 'uux' AND key1 > 'z')
nonkey = 4TRUE
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR TRUE)) OR (key1 < 'bar' AND TRUE) OR (key1 < 'uux' AND key1 > 'z')
(key1 LIKE 'abcde%' OR TRUE)
(key1 < 'uux' AND key1 >
                    'z')
(key1 < 'abc' AND TRUE) OR (key1 < 'bar' AND TRUE) OR (FALSE)
TRUE
(key1 < 'abc') OR (key1 < 'bar')
(key1 < 'bar')
WHERE
ANDOR
rangeUNIONSELECTSELECT
key1(key_part1,
            key_part2,
            key_part3)
key_part1key_part2key_part3ABC是空1空1 XYZ Foo是空2 1 1 1 1 XYZ的ABC ABC 1 2 2 1是AAA 
key_part1
            = 1
(1,-inf,-inf) <= (key_part1, key_part2, key_part3) < (1,+inf,+inf)
key_part3 =
            'abc'
HASH
key_part1cmpconst1和 key_part2cmpconst2和…和 key_partNcmpconstN; 
const1const2cmp=<=>IS NULLNN
key_part1= 1 ANDkey_part2IS NULL ANDkey_part3= 'foo'
BTREEAND=<=>IS NULL><>=<=!=<>BETWEENLIKE
                'pattern'pattern<>!=
=<=>IS NULL><>=<=!=<>BETWEENLIKE=>=
key_part1= 'foo' ANDkey_part2>= 10 ANDkey_part3> 10 
('foo',10,-inf) < (key_part1,key_part2,key_part3) < ('foo',+inf,+inf)
('foo',
                11, 0)
ORAND
( key_part1= 1 ANDkey_part2< 2) OR (key_part1> 5) 
(1,-inf) < (key_part1,key_part2) < (1,2) (5,-inf) < (key_part1,key_part2)
key_lenEXPLAIN
key_lenkey_part1key_part2key_len
key_part1>= 1 ANDkey_part2< 2
key_part1>= 1 ANDkey_part2IS NOT NULL
col_name
col_name在( val1,…, valN) col_name=val1或或 col_name=valN
col_name
col_name
col_name
col_name IN (10, 20,
            30)
eq_range_index_dive_limitNeq_range_index_dive_limitNNeq_range_index_dive_limit
ANALYZE TABLE
eq_range_index_dive_limit
FORCE INDEX
FULLTEXT
DISTINCTORDER BY
EXPLAIN FOR
            CONNECTION
rowsNULL
rows_examined_per_scanskip_index_dive_due_to_force
FOR CONNECTIONEXPLAIN
INFORMATION_SCHEMA.OPTIMIZER_TRACEskipped_due_to_force_index
CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL, PRIMARY KEY(f1, f2)); INSERT INTO t1 VALUES (1,1), (1,2), (1,3), (1,4), (1,5), (2,1), (2,2), (2,3), (2,4), (2,5); INSERT INTO t1 SELECT f1, f2 + 5 FROM t1; INSERT INTO t1 SELECT f1, f2 + 10 FROM t1; INSERT INTO t1 SELECT f1, f2 + 20 FROM t1; INSERT INTO t1 SELECT f1, f2 + 40 FROM t1; ANALYZE TABLE t1; EXPLAIN SELECT f1, f2 FROM t1 WHERE f2 > 40;
f2 > 40
f1
f1
f2 > 40
f1 = 1
f1 = 1 AND f2 > 40
f1 = 2
f1 = 2 AND f2 > 40
kmn
GROUP BY
kIN()
AND(cond1(key_part1)
                OR
                cond2(key_part1))
                AND
                (cond1(key_part2)
                OR ...) AND ...
EXPLAIN
Using index for skip scan
possible_keys
"skip scan"
“跳过扫描“{”:“跳跃式”_扫描”,“指标”: index_used_for_skip_scan,“key_parts_used_for_access”:[ key_parts_used_for_access],”前缀范围”:[ prefix_ranges“范围”:[ ], range] } 
skip_scanoptimizer_switchonoff
optimizer_switch
SELECT ... FROM t1 WHERE ( col_1, col_2 ) IN (( 'a', 'b' ), ( 'c', 'd' ));
SELECT ... FROM t1 WHERE ( col_1 = 'a' AND col_2 = 'b' ) OR ( col_1 = 'c' AND col_2 = 'd' );
range_optimizer_max_mem_size
Nrange_optimizer_max_mem_size
警告3170内存容量 N“range_optimizer_max_mem_size字节的突破。范围不该查询做了优化。 
range_optimizer_max_mem_size
OR
SELECT COUNT(*) FROM tWHERE a=1 OR a=2 OR a=3 OR .. . a=N; 
AND
SELECT COUNT(*) FROM tWHERE a=1 AND b=1 AND c=1 ...N; 
IN()
select count(*)从那里有一个在(1,2,…, M和B)和(1,2,…, N); 
IN()ORIN()ORORMN
range
SELECT * FROMtbl_nameWHEREkey1= 10 ORkey2= 20; SELECT * FROMtbl_nameWHERE (key1= 10 ORkey2= 20) ANDnon_key= 30; SELECT * FROM t1, t2 WHERE (t1.key1IN (1,2) OR t1.key2LIKE 'value%') AND t2.key1= t1.some_col; SELECT * FROM t1, t2 WHERE t1.key1= 1 AND (t2.key1= t1.some_colOR t2.key2= t1.some_col2);
EXPLAINindex_mergekey
ExtraEXPLAIN
Using intersect(...)
Using union(...)
Using sort_union(...)
WHEREAND
NN
key_part1=const1和 key_part2=const2…和 key_partN=constN
InnoDB
SELECT * FROMinnodb_tableWHEREprimary_key< 10 ANDkey_col1= 20; SELECT * FROMtbl_nameWHEREkey1_part1= 1 ANDkey1_part2= 2 ANDkey2= 2;
EXPLAINExtra
SELECT COUNT(*) FROM t1 WHERE key1 = 1 AND key2 = 1;
InnoDB
WHEREOR
NN
key_part1=const1和 key_part2=const2…和 key_partN=constN
InnoDB
SELECT * FROM t1 WHEREkey1= 1 ORkey2= 2 ORkey3= 3; SELECT * FROMinnodb_tableWHERE (key1= 1 ANDkey2= 2) OR (key3= 'foo' ANDkey4= 'bar') ANDkey5= 5;
WHEREOR
SELECT * FROMtbl_nameWHEREkey_col1< 10 ORkey_col2< 20; SELECT * FROMtbl_nameWHERE (key_col1> 10 ORkey_col2= 20) ANDnonkey_col= 30;
index_mergeindex_merge_unionoptimizer_switchonoff
optimizer_switch
NDB
NDBNDBCLUSTER
CREATE TABLE t1 (
    a INT,
    b INT,
    KEY(a)
) ENGINE=NDB;
SELECT a, b FROM t1 WHERE b = 10;
EXPLAIN
MySQL的> EXPLAIN SELECT a,b FROM t1 WHERE b = 10\G*************************** 1。行***************************编号:1 select_type:简单表:T1型:allpossible_keys:空键:空key_len:零号:空10行:额外的:使用与推条件 
SELECT a,b FROM t1 WHERE a = 10; SELECT a,b FROM t1 WHERE b + 1 = 10;
ab + 1 =
          10b = 9WHERE
><
mysql> EXPLAIN SELECT a, b FROM t1 WHERE a < 2\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
         type: range
possible_keys: a
          key: a
      key_len: 5
          ref: NULL
         rows: 2
        Extra: Using where with pushed condition
column [NOT] LIKE
              pattern
pattern
column IS [NOT]
              NULL
column IN
              (value_list)
value_list
column BETWEEN
              constant1 AND
              constant2
constant1constant2
optimizer_switch
[mysqld] optimizer_switch=engine_condition_pushdown=off
SET optimizer_switch='engine_condition_pushdown=off';
NDB
EXPLAIN
WHEREWHERE
rangerefeq_refref_or_null
InnoDBInnoDB
InnoDB
WHERE
WHERE
WHERE
EXPLAINExtra
INDEX (zipcode, lastname, firstname)
SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';
zipcode='95054'zipcode='95054'
lastname LIKE '%etrunia%'lastname
optimizer_switch
SET optimizer_switch = 'index_condition_pushdown=off'; SET optimizer_switch = 'index_condition_pushdown=on';
t1t3
表连接typet1 ranget2 reft3所有 
for each row in t1 matching range {
  for each row in t2 matching reference key {
    for each row in t3 {
      if row satisfies join conditions, send to client
    }
  }
}
ALLindexrange
join_buffer_size
for each row in t1 matching range {
  for each row in t2 matching reference key {
    store used columns from t1, t2 in join buffer
    if buffer is full {
      for each row in t3 {
        for each t1, t2 combination in join buffer {
          if row satisfies join conditions, send to client
        }
      }
      empty join buffer
    }
  }
}
if buffer is not empty {
  for each row in t3 {
    for each t1, t2 combination in join buffer {
      if row satisfies join conditions, send to client
    }
  }
}
St2C
(S*C)/join_buffer_size + 1
t3join_buffer_sizejoin_buffer_size
table_factortable_referencetable_reference
SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                 ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
CROSS JOININNER JOINCROSS JOIN
t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.b=t3.b OR t2.b IS NULL) ON t1.a=t2.a
(t1 LEFT JOIN t2 ON t1.a=t2.a) LEFT JOIN t3
    ON t2.b=t3.b OR t2.b IS NULL
t1t3
t1(2)
t2
t3
(1,1,101,101)(1,1,101,101)
mysql>SELECT *FROM t1LEFT JOIN(t2 LEFT JOIN t3 ON t2.b=t3.b OR t2.b IS NULL)ON t1.a=t2.a;+------+------+------+------+ | a | a | b | b | +------+------+------+------+ | 1 | 1 | 101 | 101 | | 2 | NULL | NULL | NULL | +------+------+------+------+ mysql>SELECT *FROM (t1 LEFT JOIN t2 ON t1.a=t2.a)LEFT JOIN t3ON t2.b=t3.b OR t2.b IS NULL;+------+------+------+------+ | a | a | b | b | +------+------+------+------+ | 1 | 1 | 101 | 101 | | 2 | NULL | NULL | 101 | +------+------+------+------+
t1 LEFT JOIN (t2, t3) ON t1.a=t2.a
t1 LEFT JOIN t2 ON t1.a=t2.a, t3
mysql>SELECT *FROM t1 LEFT JOIN (t2, t3) ON t1.a=t2.a;+------+------+------+------+ | a | a | b | b | +------+------+------+------+ | 1 | 1 | 101 | 101 | | 2 | NULL | NULL | NULL | +------+------+------+------+ mysql>SELECT *FROM t1 LEFT JOIN t2 ON t1.a=t2.a, t3;+------+------+------+------+ | a | a | b | b | +------+------+------+------+ | 1 | 1 | 101 | 101 | | 2 | NULL | NULL | 101 | +------+------+------+------+
(t1,t2) LEFT JOIN t3 ON P(t2.b,t3.b)
t1,t2,t3t2.b
t1, t2 LEFT JOIN t3 ON P(t2.b,t3.b)
join_table
SELECT * FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.b=t3.b) ON t1.a=t2.a WHERE t1.a > 1SELECT * FROM t1 LEFT JOIN (t2, t3) ON t1.a=t2.a WHERE (t2.b=t3.b OR t2.b IS NULL) AND t1.a > 1
t2 LEFT JOIN t3 ON t2.b=t3.b t2, t3
(t2,
          t3)ON
T1,T2,T3
SELECT * FROM T1内P1(T1、T2和T2)内加入T3(T2,T3),P2 P(T1,T2,T3) 
P1(T1,T2)P(T1,T2,T3)
FOR each row t1 in T1 {
  FOR each row t2 in T2 such that P1(t1,t2) {
    FOR each row t3 in T3 such that P2(t2,t3) {
      IF P(t1,t2,t3) {
         t:=t1||t2||t3; OUTPUT t;
      }
    }
  }
}
t1||t2||t3t2NULLt1||t2||NULLt2t3
SELECT * FROM T1 LEFT JOIN
              (T2 LEFT JOIN T3 ON P2(T2,T3))
              ON P1(T1,T2)
  WHERE P(T1,T2,T3)
FOR each row t1 in T1 {
  BOOL f1:=FALSE;
  FOR each row t2 in T2 such that P1(t1,t2) {
    BOOL f2:=FALSE;
    FOR each row t3 in T3 such that P2(t2,t3) {
      IF P(t1,t2,t3) {
        t:=t1||t2||t3; OUTPUT t;
      }
      f2=TRUE;
      f1=TRUE;
    }
    IF (!f2) {
      IF P(t1,t2,NULL) {
        t:=t1||t2||NULL; OUTPUT t;
      }
      f1=TRUE;
    }
  }
  IF (!f1) {
    IF P(t1,NULL,NULL) {
      t:=t1||NULL||NULL; OUTPUT t;
    }
  }
}
NULL
(T2 LEFT JOIN T3 ON P2(T2,T3))
FOR each row t3 in T3 {
  FOR each row t2 in T2 such that P2(t2,t3) {
    FOR each row t1 in T1 such that P1(t1,t2) {
      IF P(t1,t2,t3) {
         t:=t1||t2||t3; OUTPUT t;
      }
    }
  }
}
T1T3T3
SELECT * T1(T2、T3)左连接在P1(T1,T2)和P2(T1,T3),P(T1,T2,T3) 
T2
FOR each row t1 in T1 {
  BOOL f1:=FALSE;
  FOR each row t2 in T2 such that P1(t1,t2) {
    FOR each row t3 in T3 such that P2(t1,t3) {
      IF P(t1,t2,t3) {
        t:=t1||t2||t3; OUTPUT t;
      }
      f1:=TRUE
    }
  }
  IF (!f1) {
    IF P(t1,NULL,NULL) {
      t:=t1||NULL||NULL; OUTPUT t;
    }
  }
}
T3
FOR each row t1 in T1 {
  BOOL f1:=FALSE;
  FOR each row t3 in T3 such that P2(t1,t3) {
    FOR each row t2 in T2 such that P1(t1,t2) {
      IF P(t1,t2,t3) {
        t:=t1||t2||t3; OUTPUT t;
      }
      f1:=TRUE
    }
  }
  IF (!f1) {
    IF P(t1,NULL,NULL) {
      t:=t1||NULL||NULL; OUTPUT t;
    }
  }
}
WHERE
P(T1,T2,T2) = C1(T1) AND C2(T2) AND C3(T3).
FOR each row t1 in T1 such that C1(t1) {
  FOR each row t2 in T2 such that P1(t1,t2) AND C2(t2)  {
    FOR each row t3 in T3 such that P2(t2,t3) AND C3(t3) {
      IF P(t1,t2,t3) {
         t:=t1||t2||t3; OUTPUT t;
      }
    }
  }
}
C1(T1)C3(T3)T1
WHERE
P(T1,T2,T3)=C1(T1) AND C(T2) AND C3(T3)
FOR each row t1 in T1 such that C1(t1) {
  BOOL f1:=FALSE;
  FOR each row t2 in T2
      such that P1(t1,t2) AND (f1?C2(t2):TRUE) {
    BOOL f2:=FALSE;
    FOR each row t3 in T3
        such that P2(t2,t3) AND (f1&&f2?C3(t3):TRUE) {
      IF (f1&&f2?TRUE:(C2(t2) AND C3(t3))) {
        t:=t1||t2||t3; OUTPUT t;
      }
      f2=TRUE;
      f1=TRUE;
    }
    IF (!f2) {
      IF (f1?TRUE:C2(t2) && P(t1,t2,NULL)) {
        t:=t1||t2||NULL; OUTPUT t;
      }
      f1=TRUE;
    }
  }
  IF (!f1 && P(t1,NULL,NULL)) {
      t:=t1||NULL||NULL; OUTPUT t;
  }
}
P1(T1,T2)NULL
WHERE
LEFT JOIN
A LEFT
          JOIN B join_condition
BAA
AB
LEFT JOINB
WHERE
ABB
LEFT JOINcol_namecol_nameLEFT
              JOIN
RIGHT JOIN
LEFT JOINNULLWHERENULL
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
t2STRAIGHT_JOINSTRAIGHT_JOIN
FROM
(T1, ...) RIGHT JOIN (T2, ...) ON P(T1, ..., T2, ...)
(T2, ...) LEFT JOIN (T1, ...) ON P(T1, ..., T2, ...)
T1 INNER JOIN
          T2 ON P(T1,T2)P(T1,T2)
R(T2)
SELECT * T1 LEFT JOIN T2 ON P1(T1,T2) WHERE P(T1,T2) AND R(T2)
T1
WHEREUNKNOWN
T1 LEFT JOIN T2 ON T1.A=T2.A
NULLNULL
T2.B IS NOT NULLT2.B > 3T2.C <= T1.CT2.B < 2 OR T2.C > 1
NULL
T2.B IS NULLT1.B < 3 OR T2.B IS NOT NULLT1.B < 3 OR T2.B > 3
A IS NOT NULL
UNKNOWN
WHERE
SELECT * FROM T1 LEFT JOIN T2 ON T2.A=T1.A LEFT JOIN T3 ON T3.B=T1.B WHERE T3.C > 0
WHERE
SELECT * FROM T1 LEFT JOIN T2 ON T2.A=T1.A
                 INNER JOIN T3 ON T3.B=T1.B
  WHERE T3.C > 0
T1,T2,T3
SELECT * FROM T1 LEFT JOIN T2 ON T2.A=T1.A
                 LEFT JOIN T3 ON T3.B=T2.B
  WHERE T3.C > 0
SELECT * FROM T1 LEFT JOIN T2 ON T2.A=T1.A
                 INNER JOIN T3 ON T3.B=T2.B
  WHERE T3.C > 0
SELECT * FROM (T1 LEFT JOIN T2 ON T2.A=T1.A), T3 WHERE T3.C > 0 AND T3.B=T2.B
T3.B=T2.B
SELECT * FROM (T1 INNER JOIN T2 ON T2.A=T1.A), T3 WHERE T3.C > 0 AND T3.B=T2.B
SELECT * FROM T1 LEFT JOIN
              (T2 LEFT JOIN T3 ON T3.B=T2.B)
              ON T2.A=T1.A
  WHERE T3.C > 0
SELECT * FROM T1 LEFT JOIN
              (T2 INNER JOIN T3 ON T3.B=T2.B)
              ON T2.A=T1.A
  WHERE T3.C > 0
SELECT * FROM T1 LEFT JOIN
              (T2,T3)
              ON (T2.A=T1.A AND T3.B=T2.B)
  WHERE T3.C > 0
WHERET2.A=T1.A AND
          T3.C=T1.C
SELECT * FROM T1 LEFT JOIN (T2 LEFT JOIN T3 ON T3.B=T2.B) ON T2.A=T1.A AND T3.C=T1.C WHERE T3.D > 0 OR T1.D > 0
SELECT * FROM T1 LEFT JOIN
              (T2, T3)
              ON T2.A=T1.A AND T3.C=T1.C AND T3.B=T2.B
  WHERE T3.D > 0 OR T1.D > 0
InnoDB
InnoDB
NDB
ExtraEXPLAIN
InnoDB
optimizer_switchmrrmrr_cost_basedoffonon
read_rnd_buffer_sizeread_rnd_buffer_size
NULLVARCHAR
B1t2B2
B2rr1r2
B2r2r1
B1t2
rr
block_nested_loopoptimizer_switchonoff
NULL
block_nested_loopoptimizer_switchon
EXPLAINUsing join buffer (Block Nested
            Loop)ALLindexrange
join_buffer_size
batched_key_accessoptimizer_switchmrrmrr_cost_based
mysql> SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';
InnoDBMyISAM
NDB
EXPLAINUsing join buffer (Batched Key
            Access)refeq_ref
optimizer_switch
WHEREWHERE
EXPLAINfiltered
rowsrows
SELECT * FROM employee JOIN department ON employee.dept_no = department.dept_no WHERE employee.first_name = 'John' AND employee.hire_date BETWEEN '2018-01-01' AND '2018-06-01';
employee
department
dept_no
employee
employee.first_name
employee.first_name = 'John'
employee.hire_date
employee.hire_date之间的2018-01-01 '和' 2018-06-01” 
employee.first_name = 'John' AND employee.hire_date BETWEEN '2018-01-01' AND '2018-06-01'
EXPLAIN
---- ------------ -------- ------------------ --------- --------- ------ ---------- | ID |表|型| possible_keys |关键| REF |行|过滤| ---- ------------ -------- ------------------ --------- --------- ------ ---------- | 1 |员工| REF |名字,h_date,系|名字| const | 8 | 100 | | 1 |部| eq_ref |初级|小学| dept_no | 1 | 100 | ---- ------------ -------- ------------------ --------- --------- ------ ---------- 
employee'John'rows
WHEREBETWEENEXPLAIN
---- ------------ -------- ------------------ --------- --------- ------ ---------- | ID |表|型| possible_keys |关键| REF |行|过滤| ---- ------------ -------- ------------------ --------- --------- ------ ---------- | 1 |员工| REF |名字,h_date,系|名字| const | 8 | 16.31 | | 1 |部| eq_ref |初级|小学| dept_no | 1 | 100 | ---- ------------ -------- ------------------ --------- --------- ------ ---------- 
rows
EXPLAIN
condition_fanout_filteroptimizer_switch
STRAIGHT_JOINSTRAIGHT_JOIN
SET optimizer_switch = 'condition_fanout_filter=off';
SELECT /*+ SET_VAR(optimizer_switch = 'condition_fanout_filter=off') */ ...
col_nameIS
          NULLcol_name=constant_valueIS
          NULL
SELECT * FROMtbl_nameWHEREkey_colIS NULL; SELECT * FROMtbl_nameWHEREkey_col<=> NULL; SELECT * FROMtbl_nameWHEREkey_col=const1ORkey_col=const2ORkey_colIS NULL;
WHEREcol_nameIS
          NULLNULL
col_name =
          expr OR
          col_name IS NULLEXPLAINref_or_null
IS
          NULL
at2
SELECT * FROM t1 WHERE t1.a=exprOR t1.a IS NULL;SELECT * FROM t1, t2 WHERE t1.a=t2.a OR t2.a IS NULL;SELECT * FROM t1, t2  WHERE (t1.a=t2.a OR t2.a IS NULL) AND t2.b=t1.b;SELECT * FROM t1, t2  WHERE t1.a=t2.a AND (t2.b=t1.b OR t2.b IS NULL);SELECT * FROM t1, t2  WHERE (t1.a=t2.a AND t2.a IS NULL AND ...)  OR (t1.a=t2.a AND t2.a IS NULL AND ...);ref_or_null
IS
          NULL(t1.a=t2.a AND t2.a IS          NULL)b
SELECT * FROM t1, t2 WHERE (t1.a=t2.a AND t2.a IS NULL) OR (t1.b=t2.b AND t2.b IS NULL);
ORDER BYORDER BY
ORDER BY
ORDER BY
ORDER
            BYWHERE
(key_part1,
            key_part2)
(key_part1,
                key_part2)
SELECT * FROM T1秩序 key_part1, key_part2; 
SELECT *key_part1key_part2
t1ORDER BY
选择 pk, key_part1, key_part2从T1秩序 key_part1, key_part2; 
key_part1key_part2key_part1key_part2
SELECT * FROM t1 WHEREkey_part1=constantORDER BYkey_part2;
DESC
SELECT * FROM T1秩序 key_part1desc, key_part2desc;SELECT * FROM T1的地方 key_part1=constant顺序 key_part2desc; 
ORDER BYDESCDESC
ASC
SELECT * FROM t1 ORDER BYkey_part1DESC,key_part2ASC;
key_part1key_part2key_part1key_part2key_part1key_part2
key_part1
SELECT * FROM t1 WHEREkey_part1>constantORDER BYkey_part1ASC; SELECT * FROM t1 WHEREkey_part1<constantORDER BYkey_part1DESC;
ORDER BYkey_part1key_part1
SELECT * FROM T1的地方 key_part1=constant1和 key_part2> constant2顺序 key_part2; 
ORDER BY
ORDER BY
SELECT * FROM T1秩序 key1, key2; 
ORDER BY
SELECT * FROM T1的地方 key2=constant顺序 key1_part1, key1_part3; 
ORDER BY
SELECT * FROM T1的地方 key2=constant顺序 key1; 
ORDER BY
选择从T1秩序*(ABS key);选择*从T1秩序— key; 
ORDER BYEXPLAINconst
ORDER BY
ORDER BYCHAR(20)
HASH
t1.at1.aORDER BY
SELECT a FROM t1 ORDER BY a;
aat1.a
选择ABS(一)作为一个从T1的命令; 
ORDER BYat1.aABS(a)
选择ABS(一)B从T1的命令; 
GROUP BYORDER BY
ORDER
            BYfilesort
filesortsort_buffer_sizesort_buffer_sizesort_buffer_size
filesortfilesort
SELECT ... FROMsingle_table... ORDER BYnon_index_column[DESC] LIMIT [M,]N;
SELECT col1, ... FROM t1 ... ORDER BY name LIMIT 10; SELECT col1, ... FROM t1 ... ORDER BY RAND() LIMIT 15;
ORDER BYmax_length_for_sort_data
ORDER BY
sort_buffer_size
max_sort_lengthmax_sort_lengthsort_buffer_size
Sort_merge_passes
read_rnd_buffer_size
tmpdir;
EXPLAINORDER
            BY
filesort
"filesort_summary": {
  "rows": 100,
  "examined_rows": 100,
  "number_of_tmp_files": 0,
  "peak_memory_used": 25192,
  "sort_mode": "<sort_key, packed_additional_fields>"
}
peak_memory_usedsort_buffer_sizesort_buffer_sizesort_buffer_sizesort_buffer_size
sort_mode
<sort_key, rowid>
<sort_key, additional_fields>
<sort_key,
                packed_additional_fields>
EXPLAINfilesort
GROUP BY
GROUP BYBTREE
GROUP BY
GROUP BY
GROUP
            BYWHEREWHERErange
GROUP BYDISTINCT(c1,c2,c3)GROUP BY c2, c3c4
GROUP BYMIN()MAX()
c1 VARCHAR(20), INDEX (c1(10))
EXPLAINExtra
idx(c1,c2,c3)
SELECT c1, c2 FROM t1 GROUP BY c1, c2; SELECT DISTINCT c1, c2 FROM t1; SELECT c1, MIN(c2) FROM t1 GROUP BY c1; SELECT c1, c2 FROM t1 WHERE c1 <constGROUP BY c1, c2; SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 >constGROUP BY c1, c2; SELECT c2 FROM t1 WHERE c1 <constGROUP BY c1, c2; SELECT c1, c2 FROM t1 WHERE c3 =constGROUP BY c1, c2;
MIN()MAX()
AVG(DISTINCT)SUM(DISTINCT)COUNT(DISTINCT)AVG(DISTINCT)SUM(DISTINCT)COUNT(DISTINCT)
GROUP BY
idx(c1,c2,c3)
SELECT COUNT(DISTINCT c1), SUM(DISTINCT c1) FROM t1; SELECT COUNT(DISTINCT c1, c2), COUNT(DISTINCT c2, c1) FROM t1;
GROUP BYWHERE
GROUP BYGROUP BY
idx(c1,c2,c3)
GROUP BYc2 =                'a'
SELECT c1, c2, c3 FROM t1 WHERE c2 = 'a' GROUP BY c1, c3;
GROUP BY
SELECT c1, c2, c3 FROM t1 WHERE c1 = 'a' GROUP BY c2, c3;
DISTINCT
DISTINCTORDER BY
DISTINCT
SELECT DISTINCT c1, c2, c3 FROM t1 WHERE c1 >const; SELECT c1, c2, c3 FROM t1 WHERE c1 >constGROUP BY c1, c2, c3;
GROUP BYDISTINCT
LIMIT
          row_countrow_count
t1EXPLAINt1
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;
LIMIT
LIMIT
          row_count
LIMIT
LIMIT
              row_countrow_countrow_count
ORDER BY
LIMIT
              row_countrow_count
GROUP BYrow_count
SQL_CALC_FOUND_ROWS
LIMIT 0--column-type-info
LIMIT
              row_count
ORDER BYfilesort
ORDER
          BY
LIMITLIMITid
mysql> SELECT * FROM ratings ORDER BY category;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
|  1 |        1 |    4.5 |
|  5 |        1 |    3.2 |
|  3 |        2 |    3.7 |
|  4 |        2 |    3.5 |
|  6 |        2 |    3.5 |
|  2 |        3 |    5.0 |
|  7 |        3 |    2.7 |
+----+----------+--------+
LIMIT
mysql> SELECT * FROM ratings ORDER BY category LIMIT 5;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
|  1 |        1 |    4.5 |
|  5 |        1 |    3.2 |
|  4 |        2 |    3.5 |
|  3 |        2 |    3.7 |
|  6 |        2 |    3.5 |
+----+----------+--------+
ORDER
          BY
LIMITidid
MySQL的> SELECT * FROM ratings ORDER BY category, id;---- ---------- -------- | ID |范畴|评级| ---- ---------- -------- | 1 | 1 | 4.5 | | 5 | 1 | 3.2 | | 3 | 2 | 3.7 | | 4 | 2 | 3.5 | | 6 | 2 | 3.5 | | 2 | 3 | 5 | | 7 | 3 | 2.7 | ---- ---------- -------- MySQL > SELECT * FROM ratings ORDER BY category, id LIMIT 5;---- ---------- -------- | ID |范畴|评级| ---- ---------- -------- | 1 | 1 | 4.5 | | 5 | 1 | 3.2 | | 3 | 2 | 3.7 | | 4 | 2 | 3.5 | | 6 | 2 | 3.5 | ---- ---------- -------- 
RAND()UUID()
WHERE
RAND()
t
创建表(ID int不空主键,col_a varchar(100)); 
SELECT * FROM t WHERE id = POW(1,2); SELECT * FROM t WHERE id = FLOOR(1 + RAND() * 49);
SELECTUPDATE
UPDATE t SET col_a =some_exprWHERE id = FLOOR(1 + RAND() * 49);idRAND()
InnoDB
RAND()
SET @keyval = FLOOR(1 + RAND() * 49);
UPDATE t SET col_a = some_expr WHERE id = @keyval;
WHERE
UPDATE /*+ NO_MERGE(dt) */ t, (SELECT FLOOR(1 + RAND() * 49) AS r) AS dtSET col_a =some_exprWHERE id = dt.r;WHERE
SELECT * FROM t WHERE partial_key=5 AND some_column=RAND();
partial_keyRAND()
WHERE
OVEROVER
COUNT(t1.b)
SELECT * FROM t1 WHERE t1.a = (SELECT COUNT(t1.b) FROM t2);
t1.b
WHERE
mysql> SELECT * FROM t1 HAVING t1.a = (SELECT COUNT(t1.b) FROM t2);
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1
of SELECT list contains nonaggregated column 'test.t1.a'; this is
incompatible with sql_mode=only_full_group_by
COUNT(t1.b)
windowing_use_high_precisionwindowing_use_high_precision
DECIMAL
windowing_use_high_precision
windowing_use_high_precision
windowing_use_high_precisionMIN()MAX()
STDDEV_POP()STDDEV_SAMP()VAR_POP()VAR_SAMP()windowing_use_high_precision
EXPLAINEXPLAIN
          FORMAT=JSON
SELECT * FROM t1 WHERE (column1,column2) = (1,1); SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
(c1, c2, c3)
create table T1(int,int,C1,C2,C3,C4 int,char(100),primary key(C1,C2,C3)); 
WHEREkey_len=4
mysql>EXPLAIN SELECT * FROM t1WHERE c1=1 AND (c2,c3) > (1,1)\G*************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: const rows: 3 filtered: 100.00 Extra: Using where
(c2,c3) > (1,1) c2 > 1 OR ((c2 = 1) AND (c3 > 1))
key_len=12
MySQL的> EXPLAIN SELECT * FROM t1WHERE c1 = 1 AND (c2 > 1 OR ((c2 = 1) AND (c3 > 1)))\G*************************** 1。行***************************编号:1 select_type:简单表:T1分区:null类型:rangepossible_keys:主键:主要key_len:12编号:零排:3:100:使用额外的过滤 
ANDOR
IN()
EXPLAINALL
ON
ANALYZE TABLE
              tbl_name
FORCE INDEX
SELECT * FROM T1、T2力量指数( index_for_column在T1) col_name=t2.col_name; 
--max-seeks-for-key=1000SET              max_seeks_for_key=1000
IN=ANY
EXISTS
NOT IN<>ALL
EXISTS
class
SELECT class.class_num, class.class_name FROM class INNER JOIN roster WHERE class.class_num = roster.class_num;
class_numSELECT
          DISTINCT
SELECT class_num, class_name FROM class WHERE class_num IN (SELECT class_num FROM roster);
INclass
DISTINCTORDER BY
optimizer_switch
semijoin
semijoinloosescanmaterialization
duplicateweedout
duplicateweedoutoptimizer_prune_level=0
STRAIGHT_JOIN
CREATE VIEW v AS
SELECT *
FROM t1
WHERE a IN (SELECT b
           FROM t2);
SELECT STRAIGHT_JOIN *
FROM t3 JOIN v ON t3.x = v.a;
IN
EXPLAIN
EXPLAINSHOW WARNINGSWHERE
Start temporaryExtraEXPLAINEnd temporary
FirstMatch(tbl_name)
LooseScan(m..n)mn
select_typetable<subqueryN
INwhere_conditiont1
SELECT * FROM t1where T1,T2在(选择B从T2的地方。 where_condition); 
EXISTS
SELECT * FROM t1where存在(选择B从T2,T2。 where_conditionAND t1.a=t2.b);
optimizer_switchmaterializationONHAVING
oe_iie_iN
( oe_1, oe_2,…, oe_N[不]在(选择) ie_1, i_2,…, ie_N…) 
oeie
oe[不]在(选择 ie…) 
INUNKNOWNFALSE
UNKNOWNwhere_conditiont1
SELECT * FROM t1
WHERE t1.a IN (SELECT t2.b FROM t2 WHERE where_condition);
INFALSE
t2.b
SELECT * FROM t1where(T1,T1,T2(B)没有选择,B从T2,T2。 where_condition); 
BLOB
EXPLAINDEPENDENT SUBQUERYEXPLAINSHOW
          WARNINGSmaterialized-subquery
SELECT * FROM (SELECT * FROM t1) AS derived_t1;
SELECT * FROM t1;
SELECT * FROM t1 JOIN (SELECT t2.f1 FROM t2) AS derived_t2 ON t1.f2=derived_t2.f1 WHERE t1.f1 > 0;
SELECT t1.*, t2.f1 FROM t1 JOIN t2 ON t1.f2=t2.f1 WHERE t1.f1 > 0;
derived_t1
ORDER BY
DISTINCTORDER BY
FROM
ORDER
          BY
MERGE
derived_mergeoptimizer_switchER_UPDATE_TABLE_USED
derived_mergeER_UPDATE_TABLE_USEDALGORITHM=TEMPTABLEderived_merge
EXPLAINSELECT
解释查询(SELECT * FROM T1)作为derived_t1; 
SELECTEXPLAIN
FROM
SELECT * FROM t1 JOIN (SELECT t2.f1 FROM t2) AS derived_t2 ON t1.f2=derived_t2.f1 WHERE t1.f1 > 0;
t1
ref
SELECT * FROM t1 JOIN (SELECT DISTINCT f1 FROM t2) AS derived_t2 ON t1.f1=derived_t2.f1;
f1refref
MERGEcte1
WITH cte1 AS (SELECT a, b FROM table1), cte2 AS (SELECT c, d FROM table2) SELECT /*+ MERGE(cte1) NO_MERGE(cte2) */ cte1.b, cte2.d FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;
ALGORITHMCREATE VIEWWITHSELECT
CREATE ALGORITHM={TEMPTABLE|MERGE} VIEW v1 AS WITH ... SELECT ...ALGORITHMSELECTWITH
MyISAMinternal_tmp_disk_storage_engine=MYISAM
creating_tmp_table
materialized_from_subquerymaterialized_from_subqueryEXPLAIN
IN=ANYNULL
outer_exprIN (SELECTinner_exprFROM ... WHEREsubquery_where)
outer_expr
inner_exprouter_expr
EXISTS (SELECT 1 FROM ... WHEREsubquery_whereANDouter_expr=inner_expr)
NNoe_iie_i
( oe_1,…, oe_N在(选择) ie_1,…, ie_N从…哪里 subquery_where) 
EXISTS (SELECT 1 FROM ... WHEREsubquery_whereANDoe_1=ie_1AND ... ANDoe_N=ie_N)
NULL
outer_exprouter_expr=inner_exprouter_expr
outer_expr =
          inner_exprinner_expr
EXISTS (SELECT 1 FROM ... WHEREsubquery_whereAND (outer_expr=inner_exprORinner_exprIS NULL))
IS
          NULLref_or_null
MySQL的> EXPLAINSELECTouter_exprIN (SELECT t2.maybe_null_keyFROM t2, t3 WHERE ...)FROM t1;*************************** 1。行*************************** ID:1 select_type:主表:T1…*************************** 2。行***************************编号:2 select_type:相关子查询表:T2型:ref_or_nullpossible_keys:maybe_null_key关键:maybe_null_key key_len:5号:功能:2行:使用额外使用指数… 
unique_subqueryindex_subqueryNULL
OR ... IS NULL
outer_exprNULLNULL IN (SELECT inner_expr
          ...)
SELECTouter_expr=inner_expr
outer_expr
outer_expr
outer_exprSELECT
空(选择 inner_expr从…哪里 subquery_where) 
SELECT
outer_expr
outer_exprIN (SELECTinner_exprFROM ... WHEREsubquery_where)
EXISTS (SELECT 1 FROM ... WHEREsubquery_whereANDouter_expr=inner_expr)
outer_exprIN (SELECTinner_exprFROM ... WHEREsubquery_where)
EXISTS (SELECT 1 FROM ... WHEREsubquery_whereAND trigcond(outer_expr=inner_expr))
(oe_1, ...,oe_N) IN (SELECTie_1, ...,ie_NFROM ... WHEREsubquery_where)
EXISTS (SELECT 1 FROM ... WHEREsubquery_whereAND trigcond(oe_1=ie_1) AND ... AND trigcond(oe_N=ie_N) )
trigcond(X)
Xoe_i
TRUEoe_i
CREATE
            TRIGGER
trigcond()X
trigcond(X=Y
              [OR Y IS NULL])refeq_refref_or_null
trigcond(X=Y)unique_subqueryindex_subquery
EXPLAINExtra
MySQL的> EXPLAIN SELECT t1.col1,t1.col1 IN (SELECT t2.key1 FROM t2 WHERE t2.col2=t1.col2) FROM t1\G*************************** 1。行***************************编号:1 select_type:主表:2 *************************** T1。行***************************编号:2 select_type:相关子查询表:T2型:index_subquerypossible_keys:KEY1键:key1 key_len:5号:功能:2行:使用额外的地方;在空键全扫描 
EXPLAINSHOW WARNINGS
*************************** 1. row *************************** Level: Note Code: 1003Message: select `test`.`t1`.`col1` AS `col1`, <in_optimizer>(`test`.`t1`.`col1`, <exists>(<index_lookup>(<cache>(`test`.`t1`.`col1`) in t2 on key1 checking NULL where (`test`.`t2`.`col2` = `test`.`t1`.`col2`) having trigcond(<is_not_null_test>(`test`.`t2`.`key1`))))) AS `t1.col1 IN (select t2.key1 from t2 where t2.col2=t1.col2)` from `test`.`t1`
NULL IN (SELECT ...)
NULL IN
          (SELECT ...)NULL
NOT NULL
NULL
outer_exprIN (SELECTinner_exprFROM ...)
(outer_exprIS NOT NULL) AND (outer_exprIN (SELECTinner_exprFROM ...))
NULL IN (SELECT ...)AND
EXISTS (SELECTinner_exprFROM ... WHEREinner_expr=outer_expr)
NULLEXISTS
subquery_materialization_cost_basedoptimizer_switchEXISTS
INFORMATION_SCHEMA
INFORMATION_SCHEMA
INFORMATION_SCHEMA
INFORMATION_SCHEMA
character_setscollationscollation_character_set_applicabilitycolumnseventsfilesinnodb_columnsinnodb_datafilesinnodb_fieldsinnodb_foreigninnodb_foreign_colsinnodb_indexesinnodb_tablesinnodb_tablespacesinnodb_tablespaces_briefinnodb_tablestatskey_column_usageparameterspartitionsreferential_constraintsresource_groupsroutinesschematastatisticstablestable_constraintstriggersviewsview_routine_usageview_table_usage 
INFORMATION_SCHEMA
INFORMATION_SCHEMA
statistics.cardinalitytables.auto_incrementtables.avg_row_lengthtables.checksumtables.check_timetables.create_timetables.data_freetables.data_lengthtables.index_lengthtables.max_data_lengthtables.table_rowstables.update_time 
mysql.index_statsmysql.index_stats
information_schema_stats_expiry
ANALYZE TABLE
mysql.index_stats
information_schema_stats_expiry
read_onlysuper_read_onlytransaction_read_onlyinnodb_read_only
information_schema_stats_expiry
innodb_read_onlyANALYZE
          TABLEANALYZE
          TABLEinformation_schema_stats_expiry=0
INFORMATION_SCHEMAEXPLAINSHOW WARNINGSEXPLAIN
utf8mb4
MySQL的> SELECT COLLATION_NAMEFROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITYWHERE CHARACTER_SET_NAME = 'utf8mb4';| ---------------------------- collation _ name | ---------------------------- | utf8mb4 _通用_我们| | utf8mb4 _仓| | utf8mb4 _ Unicode版本_我们| | utf8mb4 _ _我们| | utf8mb4 _ latvian _我们| | utf8mb4 _罗马尼亚_我们| | utf8mb4 _ slovenian _ |我们…… 
EXPLAIN
MySQL的> EXPLAIN SELECT COLLATION_NAMEFROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITYWHERE CHARACTER_SET_NAME = 'utf8mb4'\G*************************** 1。行***************************编号:1 select_type:简单表:CS分区:null类型:constpossible_keys:小学,名字:名字key_len:194编号:const行:1过滤:额外100:使用索引*************************** 2。行***************************编号:1 select_type:简单表:西分区:null类型:refpossible_keys:character_set_id关键:character_set_id key_len:8编号:const行:68过滤:100个额外的:null2行集,1报警(0.01秒) 
SHOW WARNINGS
MySQL的> SHOW WARNINGS\G*************************** 1. row *************************** Level: Note Code: 1003Message: /* select#1 */ select `mysql`.`col`.`name` AS `COLLATION_NAME` from `mysql`.`character_sets` `cs` join `mysql`.`collations` `col` where ((`mysql`.`col`.`character_set_id` = '45') and ('utf8mb4' = 'utf8mb4'))
SHOW WARNINGSCOLLATION_CHARACTER_SET_APPLICABILITYcollations
WHERE
sys
SHOW INDEXSHOW CREATE TABLE
MySQL的> SHOW INDEX FROM performance_schema.accounts\G*************************** 1。行***************************表:账户:账户:0 non_unique key_name seq_in_index:1 column_name:用户整理:零基数:空sub_part:空包装:零:是的index_type:哈希评论:index_comment:可见:是的*************************** 2。行***************************表:账户:账户:0 non_unique key_name seq_in_index:2 column_name:主机整理:零基数:空sub_part:空包装:零:是的index_type:哈希评论:index_comment:可见:yesmysql > SHOW CREATE TABLE performance_schema.rwlock_instances\G*************************** 1. row *************************** Table: rwlock_instancesCreate Table: CREATE TABLE `rwlock_instances` ( `NAME` varchar(128) NOT NULL, `OBJECT_INSTANCE_BEGIN` bigint(20) unsigned NOT NULL, `WRITE_LOCKED_BY_THREAD_ID` bigint(20) unsigned DEFAULT NULL, `READ_LOCKED_BY_COUNT` int(10) unsigned NOT NULL, PRIMARY KEY (`OBJECT_INSTANCE_BEGIN`), KEY `NAME` (`NAME`), KEY `WRITE_LOCKED_BY_THREAD_ID` (`WRITE_LOCKED_BY_THREAD_ID`)) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8
EXPLAIN
MySQL的> EXPLAIN SELECT * FROM performance_schema.accountsWHERE (USER,HOST) = ('root','localhost')\G*************************** 1。行***************************编号:1 select_type:简单表:账户分区:零式:constpossible_keys:账号:账号:278 key_len编号:const常量行:1过滤:100个额外的:空 
EXPLAINaccountsUSER
=<=>
ORDER
            BY
INSERTUPDATEDELETEINSERTUPDATEDELETE
N
INSERTINSERTbulk_insert_buffer_size
LOAD DATA
              INFILEINSERT
InnoDB
MyISAM
SELECT
MyISAMOPTIMIZE TABLE
MyISAMkey_buffer_size
MyISAMtbl_nametbl_name
GRANTcolumns_priv
ARCHIVEOPTIMIZE TABLE
BLOB
InnoDB
SELECT
PRIMARY KEYINDEXMEMORYInnoDB
MEMORY
WHERE
(col1, col2, col3)(col1, col2)
VARCHARCHARCHAR(10)CHAR(15)
utf8
1' 1''01.e1'
MIN()MAX()key_colkey_part_N=constantkey_colMIN()MAX()
选择最小( key_part2)、马克斯( key_part2from) tbl_name哪里 key_part1=10;
ORDER BY key_part1,
            key_part2
SELECTkey_part3FROMtbl_nameWHEREkey_part1=1
NOT NULLInnoDB
SPATIALSRID
SPATIAL
SPATIAL
SPATIAL
INSERTUPDATEDELETE
SPATIAL
col_name
选择不同的st_srid( col_name从) tbl_name; 
SRID
SPATIAL
=≤IN
col_name(N)NBLOBTEXT
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
InnoDBCOMPACTDYNAMIC
CREATE TABLEALTER TABLECREATE INDEXCHARVARCHARTEXTBINARYVARBINARYBLOB
FULLTEXTInnoDBMyISAMCHARVARCHARTEXT
FULLTEXT
FULLTEXT
FULLTEXTWHERE
FULLTEXTWHEREWHERE MATCH(text)
              AGAINST
              ('other_text')
EXPLAIN
EXPLAINExtra
SELECT * FROMtbl_nameWHEREhash_col=MD5(CONCAT(val1,val2)) ANDcol1=val1ANDcol2=val2;
CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
);
namefirst_namefirst_namename
SELECT * FROM test WHERE last_name='Widenius';SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael';SELECT * FROM test WHERE last_name='Widenius' AND (first_name='Michael' OR first_name='Monty');SELECT * FROM test WHERE last_name='Widenius' AND first_name >='M' AND first_name < 'N';
name
SELECT * FROM test WHERE first_name='Michael'; SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';
SELECT
SELECT * FROM tbl_nameWHERE col1=val1AND col2=val2; 
col1col1
(col1,
        col2, col3)(col1, col2)
SELECT
SELECT * FROM tbl_nameWHERE col1=val1选择*; tbl_nameWHERE col1=val1AND col2=val2选择*; tbl_nameWHERE col2=val2选择*; tbl_nameWHERE col2=val2AND col3=val3; 
(col1, col2, col3)(col2, col3)
EXPLAIN
ref
(...) JOINtbl_nameONtbl_name.key=expr
SHOW INDEXN/SNS
<=>NULL <=> NULLN<=>NN
=NULLexpr1=expr2expr1expr2reftbl_name.key=exprexpr
=NULL
InnoDBinnodb_stats_methodmyisam_stats_method
nulls_equal
NULLNULLref
nulls_unequalNULL
NULLNULLnulls_unequalref
nulls_ignored
<=>=NULLnulls_equal
innodb_stats_methodmyisam_stats_methodmyisam_stats_method
MyISAM
myisam_stats_methodANALYZE TABLE
innodb_stats_methodmyisam_stats_method
ALTER TABLEinnodb_stats_methodmyisam_stats_method
InnoDBnulls_equal
MEMORY
=>>=<<=BETWEENLIKELIKESELECT
SELECT * FROM tbl_name哪里 key_col像“帕特里克%;select * from tbl_name哪里 key_col像Pat _ck % %; 
'Patrick'
          <= key_col <
          'Patricl''Pat' <=key_col< 'Pau'
SELECT
SELECT * FROM tbl_name哪里 key_col像“%帕特里克%;select * from tbl_name哪里 key_col喜欢 other_col; 
LIKELIKE
... LIKE
          '%string%'string
col_name IS
          NULLcol_name
ANDAND
WHERE
…哪里 index_part1=1 ANDindex_part2=2 ANDother_column=3 /*index= 1 ORindex= 2 */... WHEREindex=1 OR A=10 ANDindex=2 /* optimized like "index_part1='hello'" */... WHEREindex_part1='hello' ANDindex_part3=5 /* Can use index onindex1但不在 index2或 index3* /……where index1=1 ANDindex2=2 ORindex1=3 ANDindex3=3;
WHERE
/*index_part1is not used */ ... WHEREindex_part2=1 ANDindex_part3=2 /* Index is not used in both parts of the WHERE clause */ ... WHEREindex=1 OR A=10 /* No index spans all rows */ ... WHEREindex_part1=1 ORindex_part2=10
LIMIT
InnoDB
CREATE TABLE t1 ( i1 INT NOT NULL DEFAULT 0, i2 INT NOT NULL DEFAULT 0, d DATE DEFAULT NULL, PRIMARY KEY (i1, i2), INDEX k_d (d)) ENGINE = InnoDB;
(i1,
        i2)(d)(d, i1, i2)
refindex_mergeMIN()MAX()
t1
INSERT INTO t1 VALUES(1, 1, '1998-01-01'), (1, 2, '1999-01-01'),(1, 3, '2000-01-01'), (1, 4, '2001-01-01'),(1, 5, '2002-01-01'), (2, 1, '1998-01-01'),(2, 2, '1999-01-01'), (2, 3, '2000-01-01'),(2, 4, '2001-01-01'), (2, 5, '2002-01-01'),(3, 1, '1998-01-01'), (3, 2, '1999-01-01'),(3, 3, '2000-01-01'), (3, 4, '2001-01-01'),(3, 5, '2002-01-01'), (4, 1, '1998-01-01'),(4, 2, '1999-01-01'), (4, 3, '2000-01-01'),(4, 4, '2001-01-01'), (4, 5, '2002-01-01'),(5, 1, '1998-01-01'), (5, 2, '1999-01-01'),(5, 3, '2000-01-01'), (5, 4, '2001-01-01'),(5, 5, '2002-01-01'); 
EXPLAIN SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01'
(i1, i2)k_d
k_dEXPLAIN
MySQL的> EXPLAIN SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01'\G*************************** 1。行***************************编号:1 select_type:简单表:T1型:refpossible_keys:小学、k_d关键:k_d key_len:4编号:const行:额外5:使用;使用索引 
k_d(d,
        i1)
MySQL的> EXPLAIN SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01'\G*************************** 1。行***************************编号:1 select_type:简单表:T1型:refpossible_keys:小学、k_d关键:k_d key_len:8编号:const常量行:额外1:使用索引 
keyEXPLAIN
key_leni1
refconst,const
rows
ExtraUsing index
SHOW
        STATUS
FLUSH TABLE t1;FLUSH STATUS;SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01';SHOW STATUS LIKE 'handler_read%'
FLUSH
        TABLESFLUSH STATUS
SHOW
        STATUS
----------------------- ------- | variable_name |价值| ----------------------- ------- | handler_read_first | 0 | | handler_read_key | 1 | | handler_read_last | 0 | | handler_read_next | 5 | | handler_read_prev | 0 | | handler_read_rnd | 0 | | handler_read_rnd_next | 0 | ----------------------- ------- 
SHOW
        STATUSHandler_read_next
----------------------- ------- | variable_name |价值| ----------------------- ------- | handler_read_first | 0 | | handler_read_key | 1 | | handler_read_last | 0 | | handler_read_next | 1 | | handler_read_prev | 0 | | handler_read_rnd | 0 | | handler_read_rnd_next | 0 | ----------------------- ------- 
use_index_extensionsoptimizer_switchuse_index_extensions
SET optimizer_switch = 'use_index_extensions=off';
CREATE TABLE t1 (f1 INT, gc INT AS (f1 + 1) STORED, INDEX (gc));
gcWHERE
SELECT * FROM t1 WHERE gc > 9;
WHEREGROUP BYgc
SELECT * FROM T1在F1的9 1.; 
f1 +
        1gcEXPLAIN
MySQL的> EXPLAIN SELECT * FROM t1 WHERE f1 + 1 > 9\G*************************** 1。行***************************编号:1 select_type:简单表:T1分区:null类型:rangepossible_keys:GC关键:GC key_len:5编号:零排:1过滤:额外100:使用索引条件 
f1
        + 1EXPLAINSHOW
        WARNINGS
MySQL的> SHOW WARNINGS\G*************************** 1。行***************************水平:注意代码:1003message:/ *选择# 1 * /选择`测试`。` T1 `。` F1 `作为` F1 `,`测试`。` T1 `。` GC `作为` GC `从`测试`。` T1 `哪里(`测试` ` T1。` ` GC ` > 9)。 
f1 + 1f1 + 1
=<<=>>=BETWEENIN()
BETWEENIN()BETWEENIN()BETWEENIN()
gc INT AS (f1) STORED
JSON_UNQUOTE()
doc_name文本(json_extract(JDoc,“美元。名字))存储 
doc_name TEXT AS (JSON_UNQUOTE(JSON_EXTRACT(jdoc, '$.name'))) STORED
... WHERE JSON_EXTRACT(jdoc, '$.name') = 'some_string' ... ... WHERE JSON_UNQUOTE(JSON_EXTRACT(jdoc, '$.name')) = 'some_string' ...
JSON_UNQUOTE()
VISIBLECREATE TABLECREATE INDEXALTER TABLE
CREATE TABLE t1 ( i INT, j INT, k INT, INDEX i_idx (i) INVISIBLE) ENGINE = InnoDB;CREATE INDEX j_idx ON t1 (j) INVISIBLE;ALTER TABLE t1 ADD INDEX k_idx (k) INVISIBLE;
VISIBLEALTER TABLE ... ALTER INDEX
修改表T1改变指数i_idx无形;改变表T1改变指数i_idx可见; 
INFORMATION_SCHEMA.STATISTICSSHOW INDEX
MySQL的> SELECT INDEX_NAME, IS_VISIBLEFROM INFORMATION_SCHEMA.STATISTICSWHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 't1';有一个是一个隐形的,可见的,可见的的。 
EXPLAIN
use_invisible_indexesoptimizer_switchon
UNIQUE
CREATE TABLE t2 ( i INT NOT NULL, j INT NOT NULL, UNIQUE j_idx (j) ) ENGINE = InnoDB;
NOT NULL
mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;
ERROR 3522 (HY000): A primary key index cannot be invisible.
ALTER TABLE t2 ADD PRIMARY KEY (i);
j
MySQL的> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;查询行,0行受影响(0.03秒) 
DESC
CREATE TABLE t ( c1 INT, c2 INT, INDEX idx1 (c1 ASC, c2 ASC), INDEX idx2 (c1 ASC, c2 DESC), INDEX idx3 (c1 DESC, c2 ASC), INDEX idx4 (c1 DESC, c2 DESC) );
ORDER BY
ORDER BY c1 ASC, c2 ASC -- optimizer can use idx1 ORDER BY c1 DESC, c2 DESC -- optimizer can use idx4 ORDER BY c1 ASC, c2 DESC -- optimizer can use idx2 ORDER BY c1 DESC, c2 ASC -- optimizer can use idx3
InnoDB
InnoDBFTS_DOC_ID
VIRTUAL
DISTINCT
BTREEFULLTEXT
ASCHASHSPATIAL
InnoDBDYNAMICinnodb_default_row_formatCREATE
              TABLEALTER
              TABLE
COMPACTCOMPRESSED
CHARutf8mb4ROW_FORMAT=REDUNDANTCHAR(N)NInnoDBNNN
ROW_FORMAT=COMPRESSEDMyISAMMyISAM
MyISAMVARCHARTEXTBLOBVARCHARCREATE TABLEROW_FORMAT=FIXED
InnoDB
customercustomer_name
BINARY
VARCHARGROUP BYMEMORY
InnoDB
InnoDB
VARCHAR
MD5()AND blob_column =
              long_string_value
Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12
Open tables
MyISAM
table_open_cachemax_connections
table_open_cachemax_connectionsNN
table_open_cachetable_open_cache
MyISAMMyISAM--open-files-limit
table_open_cachetable_open_cache
table_open_cache
FLUSH
              TABLES
MyISAM
HANDLER
          tbl_name OPENtbl_name
Opened_tables
MySQL的> SHOW GLOBAL STATUS LIKE 'Opened_tables';变量名称和值_ ------- | | | ---------------打开表| ------- | _ 2741 | --------------- ------- 
FLUSH
          TABLES
MyISAMSELECT
UNION
TEMPTABLEUNION
ORDER
            BYORDER
            BY
DISTINCT
SQL_SMALL_RESULT
INSERT ...
            SELECTSELECT
UPDATE
EXPLAINUsing temporaryEXPLAIN
Created_tmp_tablesCreated_tmp_disk_tables
UNIONEXPLAIN
UNION
UNION ALLUNION
            DISTINCT
ORDER BY
{INSERT | REPLACE} ... SELECT ...
TempTableInnoDB
internal_tmp_mem_storage_engineMEMORY
TempTableVARCHARVARBINARYtemptable_max_ramtemptable_max_ram
tmpdir
tmpdirmysqld
temptable_max_ram
memory/temptable/physical_ramTempTablememory/temptable/physical_disktemptable_max_rammemory_summary_global_by_event_name
MEMORYtmp_table_sizemax_heap_table_sizeCREATE
          TABLEmax_heap_table_size
internal_tmp_disk_storage_engineMYISAM
MyISAMinternal_tmp_disk_storage_engine=MYISAM
internal_tmp_disk_storage_engine=INNODBInnoDBinternal_tmp_disk_storage_engine
TempTableVARBINARYtemptable_max_ram
MEMORYVARBINARYBINARY
InnoDBinternal_tmp_disk_storage_engine
MEMORYbig_tables
InnoDBInnoDB
OPTIMIZE TABLE
OPTIMIZE TABLE
InnoDBAUTO_INCREMENT
VARCHARCHARCHAR(N)N
COMPACTutf8CHAR(N)N
COMPRESSEDCOMPACT
InnoDB
AUTOCOMMIT=1SET AUTOCOMMIT=0START
            TRANSACTION
InnoDB
SELECTInnoDB
innodb_change_buffering=all
COMMIT
innodb_force_recovery=3
innodb_change_buffering=all
innodb_flush_log_at_trx_commit
InnoDB
READ COMMITTEDREPEATABLE READ
PAGE_MAX_TRX_ID
InnoDBTRX_IDSELECT ... FOR UPDATE
InnoDB
START TRANSACTION
            READ ONLYMyISAM
错误1792(25006):无法执行语句在只读事务。 
autocommitSELECTFOR
            UPDATE
READ
            ONLY
InnoDBSTART TRANSACTION READ
        ONLYCOMMITautocommit
START
        TRANSACTIONautocommit
InnoDBSHOW ENGINE
          INNODB STATUS
InnoDB
innodb_log_file_sizeinnodb_log_files_in_group
innodb_log_buffer_size
innodb_log_write_ahead_sizeinnodb_log_write_ahead_size
innodb_log_write_ahead_sizeInnoDBinnodb_page_sizeinnodb_log_write_ahead_sizeinnodb_page_sizeinnodb_log_write_ahead_sizeinnodb_page_size
innodb_log_write_ahead_size
innodb_log_wait_for_flush_spin_hwm
innodb_log_spin_cpu_abs_lwm
innodb_log_spin_cpu_pct_hwm
innodb_log_spin_cpu_pct_hwm
InnoDBSET
            autocommitCOMMIT
SET autocommit=0;... SQL import statements ...承诺; 
--optSET
            autocommitCOMMIT
UNIQUE
SET unique_checks=0;... SQL import statements ...SET unique_checks=1;InnoDB
FOREIGN KEY
SET foreign_key_checks=0;... SQL import statements ...SET foreign_key_checks=1;INSERT
插入的热情yourtable值(1,2),(5)…………………; 
InnoDB
innodb_autoinc_lock_mode
PRIMARY KEYPRIMARY KEY
InnoDB
FTS_DOC_IDFTS_DOC_ID_INDEX
CREATE TABLE t1 (FTS_DOC_ID BIGINT unsigned NOT NULL AUTO_INCREMENT,title varchar(255) NOT NULL DEFAULT '',text mediumtext NOT NULL,PRIMARY KEY (`FTS_DOC_ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on t1(FTS_DOC_ID);
FULLTEXT
FTS_DOC_IDFULLTEXTINSERTUPDATEInnoDBFTS_DOC_IDCREATE
              FULLTEXT INDEX
InnoDBInnoDB
InnoDB
NULLNULL
InnoDB
CREATEDROP
TRUNCATE TABLEtbl_nameDELETEDROP TABLECREATE TABLE
InnoDBCREATE TABLEDROP
top
InnoDBinnodb_buffer_pool_sizeinnodb_buffer_pool_size
fsync()innodb_flush_method
InnoDBinnodb_use_native_aio
InnoDBInnoDBforcedirectioInnoDBinnodb_flush_method =
            O_DIRECTdirectio()
InnoDBinnodb_buffer_pool_sizeforcedirectioinnodb_flush_methodconvosync=direct
MyISAM
InnoDB
InnoDB
crc32
InnoDB
minimal
InnoDBinnodb_io_capacity
InnoDBinnodb_io_capacitySHOW ENGINE
            INNODB STATUS
innodb_max_dirty_pages_pct
Log sequence number - Last checkpoint
innodb_doublewriteinnodb_flush_method
InnoDBinnodb_log_compressed_pageszlibinnodb_log_compressed_pages
InnoDBInnoDB
InnoDB
innodb_adaptive_hash_index
InnoDB
InnoDB
InnoDB
InnoDB
InnoDB
InnoDB
InnoDB
InnoDBinnodb_thread_concurrencyinnodb_concurrency_tickets
InnoDBSELECT 1 FROM
            tbl_name LIMIT 1
innodb_stats_persistent
MyISAMInnoDB
MyISAM
ANALYZE TABLESHOW INDEX FROM
            tbl_name
SELECT
MyISAMINSERTOPTIMIZE
            TABLEconcurrent_insert
MyISAMVARCHARBLOBTEXT
MyISAM
ALTER TABLE ... ORDER BY
            expr1,
            expr2, ...expr1expr2
UPDATEtbl_nameSETcount_col=count_col+1 WHEREkey_col=constant;
MyISAM
OPTIMIZE TABLE
MyISAMDELAY_KEY_WRITE=1--myisam-recover-optionsDELAY_KEY_WRITE
MyISAM
MyISAMSELECT
LOAD DATA
            INFILE
/path/to/db/tbl_name
LOAD DATA
                INFILE
/path/to/db/tbl_nameLOAD
                DATA INFILE
LOAD DATA
            INFILELOAD
            DATA INFILE
MyISAMFLUSH TABLES
修改表 tbl_name禁用按键;修改表 tbl_name使钥匙; 
INSERT
锁定表写;插入一个值(1,23),(2,34),(4,33);插入一个值(8,26),(6,29);解锁表; 
INSERTINSERTINSERT
INSERTUPDATEDELETELOCK
            TABLESUNLOCK
            TABLES
INSERTLOAD DATA
            INFILE
MyISAMLOAD DATA
            INFILEINSERTkey_buffer_size
REPAIR TABLE
REPAIR TABLEmyisam_max_sort_file_size
--key_buffer_size=128M --myisam_sort_buffer_size=256M --read_buffer_size=64M --write_buffer_size=64M
| key_buffer_size | key_buffer_size | 
| myisam_sort_buffer_size | myisam_sort_buffer_size | 
| read_buffer_size | read_buffer_size | 
| write_buffer_size | 
myisam_sort_buffer_sizeread_buffer_sizekey_buffer_sizemyisam_max_sort_file_sizekey_buffer_sizekey_buffer_sizekey_buffer_size
REPAIR
        TABLE
SET SESSION myisam_sort_buffer_size = 256*1024*1024; SET SESSION read_buffer_size = 64*1024*1024; SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024; SET GLOBAL repair_cache.key_buffer_size = 128*1024*1024; CACHE INDEXtbl_nameIN repair_cache; LOAD INDEX INTO CACHEtbl_name; REPAIR TABLEtbl_name; SET GLOBAL repair_cache.key_buffer_size = 0;
REPAIR
        TABLE
SET @old_myisam_sort_buffer_size = @@global.myisam_max_sort_file_size;SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024;REPAIR TABLE tbl_name ;SET GLOBAL myisam_max_sort_file_size = @old_myisam_max_sort_file_size;
REPAIR
        TABLE
[mysqld] myisam_sort_buffer_size=256M key_buffer_size=1G myisam_max_sort_file_size=100G
read_buffer_sizeread_buffer_size
MEMORYMyISAM
MEMORYCREATE INDEXUSING HASHBETWEEN=INUSING HASHMEMORY
WHEREEXPLAINEXPLAIN
EXPLAIN
EXPLAINEXPLAIN
EXPLAINconnection_id
SELECTEXPLAINSHOW WARNINGS
EXPLAIN
FORMATFORMAT
EXPLAINEXPLAINSELECTSELECTSTRAIGHT_JOIN
EXPLAIN
ANALYZE
        TABLE
EXPLAINEXPLAIN
          tbl_nametbl_nametbl_name
EXPLAINEXPLAINSELECTDELETEINSERTREPLACEUPDATE
EXPLAINSELECT
EXPLAIN
EXPLAINtypeExtra
EXPLAINFORMAT=JSON
| id | select_id | SELECT | 
| select_type | SELECT | |
| table | table_name | |
| partitions | partitions | |
| type | access_type | |
| possible_keys | possible_keys | |
| key | key | |
| key_len | key_length | |
| ref | ref | |
| rows | rows | |
| filtered | filtered | |
| Extra | 
NULL
SELECTSELECTtable<unionMNMN
SELECTSELECTSIMPLE
| select_type | ||
|---|---|---|
| SIMPLE | SELECTUNION | |
| PRIMARY | SELECT | |
| UNION | SELECTUNION | |
| DEPENDENT UNION | dependent | SELECTUNION | 
| UNION RESULT | union_result | UNION | 
| SUBQUERY | SELECT | |
| DEPENDENT SUBQUERY | dependent | SELECT | 
| DERIVED | ||
| MATERIALIZED | materialized_from_subquery | |
| UNCACHEABLE SUBQUERY | cacheable | |
| UNCACHEABLE UNION | cacheable | UNION | 
DEPENDENT
DEPENDENT SUBQUERYDEPENDENT SUBQUERY
FORMAT=JSONselect_typeSELECTmaterialized_from_subquerySIMPLE
select_typeSELECTDELETEDELETE
<unionM,N>MN
<derivedN>N
<subqueryN>N
NULL
EXPLAIN
possible_keys
possible_keysEXPLAIN
NULLEXPLAIN
SHOW INDEX
              FROM tbl_name
key
keypossible_keys
InnoDBkey
possible_keysUSE
              INDEX
MyISAMANALYZE TABLE
key_lenkeylen_len
NULL
ref
funcSHOW WARNINGSEXPLAINEXPLAIN
rows
InnoDB
filteredrowsrows
EXPLAIN
Extra
typeEXPLAIN
The table has only one row (= system table). This is a              special case of theconst
const
constUNIQUEtbl_nameconst
SELECT * FROM tbl_name哪里 primary_key=1;SELECT * FROMtbl_name哪里 primary_key_part1=1 ANDprimary_key_part2=2;
systemconstUNIQUE NOT
              NULL
eq_ref=eq_refref_table
SELECT * FROM ref_table, other_table哪里 ref_tablekey_column=other_tablecolumn选择*; ref_table, other_table哪里 ref_tablekey_column_part1=other_tablecolumn和 ref_tablekey_column_part2=1;
refUNIQUE
ref=<=>refref_table
SELECT * FROM ref_table哪里 key_column=expr选择*; ref_table, other_table哪里 ref_tablekey_column=other_tablecolumn选择*; ref_table, other_table哪里 ref_tablekey_column_part1=other_tablecolumn和 ref_tablekey_column_part2=1;
FULLTEXT
refref_or_nullref_table
SELECT * FROM ref_table哪里 key_column=expr或 key_column是空的; 
key
eq_ref
valueIN (SELECTprimary_keyFROMsingle_tableWHEREsome_expr)
unique_subquery
unique_subquery
valueIN (SELECTkey_columnFROMsingle_tableWHEREsome_expr)
keyref
range=<>>>=<<=IS NULL<=>BETWEENLIKEIN()
SELECT * FROM tbl_name哪里 key_column= 10;SELECT * FROMtbl_name哪里 key_column之间的10和20;select * from tbl_name哪里 key_column在(30);选择* tbl_name哪里 key_part1= 10 ANDkey_part2(10,20,30); 
indexALL
ExtraALL
Uses index
constALL
ExtraEXPLAINmessage
ExtraUsing temporaryusing_filesorttrue
const row not found
SELECT ... FROM
              tbl_name
Deleting all rows
DELETEMyISAM
Distinct
FirstMatch(tbl_name)
tbl_name
Full scan on NULL key
Impossible HAVING
HAVING
Impossible WHERE
WHERE
Impossible WHERE noticed after reading const
              tables
LooseScan(m..n)
mn
No matching min/max row
SELECT MIN(...) FROM ... WHERE
              condition
no matching row in const table
No matching rows after partition
              pruning
No tables used
FROM
INSERTREPLACEEXPLAINSELECTEXPLAIN INSERT INTO t SELECT 10 FROM
              DUAL
Not exists
LEFT JOIN
SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
t2.idt1t1.idt2.idt2t1t2
Plan isn't ready yet
EXPLAIN FOR
              CONNECTION
Range checked for each record (index map:
              N)
rangeindex_merge
SHOW INDEXN
Recursive
SELECT
Scanned N
              databases
INFORMATION_SCHEMAN
Select tables optimized away
GROUP BY
SELECT MIN(c1), MIN(c2) FROM t1;
MIN(c1)c1
Extra
SELECT MIN(c2) FROM t1 WHERE c1 <= 10;
(c1, c2)c1 <=              10c2
SELECT MIN(c2) FROM t1 WHERE c1 = 10;
c1 =
              10
MyISAMExtraWHERE
Skip_open_tableOpen_full_table
INFORMATION_SCHEMA
Skip_open_table
Open_frm_only
Open_full_table
Start temporarymessage
unique row not found
SELECT ... FROM
              tbl_namePRIMARY KEY
Using filesort
WHERE
Using index
InnoDBExtraindexPRIMARY
Using index condition
Using index for group-by
Using indexGROUP BY
Using index for skip scan
Using join buffer (Block Nested Loop)using_join_buffer
(Block Nested Loop)EXPLAIN
using_join_bufferBatched Key Access
Using MRR
Using sort_union(...)Using
              intersect(...)
index_merge
Using temporary
GROUP BY
Using where
WHEREUsing whereALLindex
Using whereWHERE
Using where with pushed condition
NDB
Zero limit
LIMIT 0
rowsEXPLAINmax_join_sizeSELECT
EXPLAIN
SELECTEXPLAIN
EXPLAIN SELECT tt.TicketNumber, tt.TimeIn, tt.ProjectReference, tt.EstimatedShipDate, tt.ActualShipDate, tt.ClientID, tt.ServiceCodes, tt.RepetitiveID, tt.CurrentProcess, tt.CurrentDPPerson, tt.RecordVolume, tt.DPPrinted, et.COUNTRY, et_1.COUNTRY, do.CUSTNAME FROM tt, et, et AS et_1, do WHERE tt.SubmitTime IS NULL AND tt.ActualPC = et.EMPLOYID AND tt.AssignedPC = et_1.EMPLOYID AND tt.ClientID = do.CUSTNMBR;
| tt | ActualPC | CHAR(10) | 
| tt | AssignedPC | CHAR(10) | 
| tt | ClientID | CHAR(10) | 
| et | EMPLOYID | CHAR(15) | 
| do | CUSTNMBR | CHAR(15) | 
| tt | ActualPC | 
| tt | AssignedPC | 
| tt | ClientID | 
| et | EMPLOYID | 
| do | CUSTNMBR | 
tt.ActualPC
EXPLAIN
桌上型possible_keys关键key_len参考行提取所有主要零零零74do所有原零空2135et_1所有原零零零74tt所有assignedpc,零零零3872 clientId,actualpc范围检查每个记录(指数图:0x23) 
typeALLfor each table, this          output indicates that MySQL is generating a Cartesian product          of all the tables; that is, every combination of rows. This          takes quite a long time, because the product of the number of          rows in each table must be examined. For the case at hand,          this product is 74 × 2135 × 74 × 3872 =          45,268,558,720 rows. If the tables were bigger, you can only          imagine how long it would take.
VARCHARCHARCHAR(10)CHAR(15)
ALTER TABLE
mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
tt.ActualPCVARCHAR(15)EXPLAIN
桌上型possible_keys关键key_len参考行extratt所有assignedpc,零零零3872使用clientId,哪里actualpcdo所有原零零零2135范围检查每个记录(指数图:0x1)et_1所有原零零零74范围检查每个记录(指数图:0x1)等eq_ref小学15 tt.actualpc 1 
rows
tt.AssignedPC =
          et_1.EMPLOYIDtt.ClientID =          do.CUSTNMBR
mysql>ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),MODIFY ClientID VARCHAR(15);
EXPLAIN
桌上型possible_keys关键key_len参考行提取所有主要零零零74tt REF assignedpc,actualpc 15 et.employid 52使用clientId,哪里actualpcet_1 eq_ref小学15 tt.assignedpc 1do eq_ref小学15 tt.clientid 1 
tt.ActualPC
mysql> ANALYZE TABLE tt;
EXPLAIN
桌上型possible_keys关键key_len参考行extratt所有assignedpc零零零3872使用clientId,哪里actualpcet eq_ref小学15 tt.actualpc 1et_1 eq_ref小学15 tt.assignedpc 1do eq_ref小学15 tt.clientid 1 
rowsEXPLAINSTRAIGHT_JOINSELECTSTRAIGHT_JOIN
EXPLAIN
          SELECT
EXPLAINEXPLAINSHOW WARNINGSEXPLAINSELECTDELETEINSERTREPLACEUPDATESELECT
MessageSHOW WARNINGSSELECTSELECT
SHOW WARNINGSEXPLAINSELECTSHOW WARNINGSDELETEINSERTREPLACEUPDATE
EXPLAIN
MySQL的> EXPLAINSELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1\G*************************** 1。行*************************** ID:1 select_type:主表:T1型:indexpossible_keys:空键:主要key_len:四号:空的行数:4过滤:壹佰额外:使用索引*************************** 2。行*************************** ID:2 select_type:子查询表:T2型:indexpossible_keys:关键:一key_len:五号:空的行数:3过滤:壹佰额外:在使用指数排,1警告(0.001秒)MySQL > SHOW WARNINGS\G*************************** 1. row *************************** Level: Note Code: 1003Message: /* select#1 */ select `test`.`t1`.`a` AS `a`, <in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in ( <materialize> (/* select#2 */ select `test`.`t2`.`a` from `test`.`t2` where 1 having 1 ), <primary_index_lookup>(`test`.`t1`.`a` in <temporary table> on <auto_key> where ((`test`.`t1`.`a` = `materialized-subquery`.`a`))))) AS `t1.a IN (SELECT t2.a FROM t2)` from `test`.`t1`1 row in set (0.00 sec)
SHOW
        WARNINGS
SHOW
        WARNINGS
<auto_key>
<cache>(expr)
<temporary
            table>
<exists>(query
            fragment)
EXISTS
<in_optimizer>(query
            fragment)
<index_lookup>(query
            fragment)
<if>(condition,
            expr1,
            expr2)
expr1expr2
<is_not_null_test>(expr)
NULL
<materialize>(query
            fragment)
`materialized-subquery`.col_name
col_name
<primary_index_lookup>(query
            fragment)
<ref_null_helper>(expr)
/* select#N */
            select_stmt
SELECTEXPLAINN
outer_tables semi join
            (inner_tables)
inner_tables
<temporary table>
constsystemFORMAT=JSONconstref
EXPLAIN [options] FOR CONNECTIONconnection_id;
EXPLAIN FOR CONNECTIONEXPLAINEXPLAINEXPLAIN FOR
        CONNECTION
connection_idPROCESSLISTSHOW PROCESSLISTPROCESS
EXPLAIN FOR CONNECTIONSELECTDELETEINSERTREPLACEUPDATE
EXPLAIN
EXPLAIN
MySQL的> SELECT CONNECTION_ID();_;| connection ID(373);| | |;1行集(0秒)在MySQL > EXPLAIN FOR CONNECTION 373;错误1889(hy000):连接命令解释是supportedonly选择/更新/插入/删除/替换 
Com_explain_otherEXPLAIN FOR
        CONNECTION
log(row_count) /
        log(index_block_length / 3 * 2 /
        (index_length +
        data_pointer_length)) + 1
MEDIUMINT4
This index would require storage of about 500,000 * 7 * 3/2 = 5.2MB (assuming a typical index buffer fill ratio of 2/3), so you probably have much of the index in memory and so need only one or two calls to read data to find the row.
NNkey_buffer_size
optimizer_prune_leveloptimizer_prune_level=1optimizer_prune_level=0
optimizer_search_depthoptimizer_search_depthoptimizer_search_depthoptimizer_search_depthoptimizer_search_depth
optimizer_switchoptimizer_switch
optimizer_switchoptimizer_switch
SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY, f2_idx) */ f1 FROM t3 WHERE f1 > 30 AND f1 < 33; SELECT /*+ BKA(t1) NO_BKA(t2) */ * FROM t1 INNER JOIN t2 WHERE ...; SELECT /*+ NO_ICP(t1, t2) */ * FROM t1 INNER JOIN t2 WHERE ...; SELECT /*+ SEMIJOIN(FIRSTMATCH, LOOSESCAN) */ * FROM t1 ...; EXPLAIN SELECT /*+ NO_ICP(t1) */ * FROM t1 WHERE ...; SELECT /*+ MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt; INSERT /*+ SET_VAR(foreign_key_checks=OFF) */ INTO t2 VALUES(2);
| BKANO_BKA | ||
| BNLNO_BNL | ||
| INDEX_MERGENO_INDEX_MERGE | ||
| JOIN_FIXED_ORDER | FROM | |
| JOIN_ORDER | ||
| JOIN_PREFIX | ||
| JOIN_SUFFIX | ||
| MAX_EXECUTION_TIME | ||
| MERGENO_MERGE | ||
| MRRNO_MRR | ||
| NO_ICP | ||
| NO_RANGE_OPTIMIZATION | ||
| QB_NAME | ||
| RESOURCE_GROUP | ||
| SEMIJOINNO_SEMIJOIN | ||
| SKIP_SCANNO_SKIP_SCAN | ||
| SET_VAR | ||
| SUBQUERY | IN | 
/*+ ... */+
/*+ BKA(t1) */ /*+ BNL(t1, t2) */ /*+ NO_RANGE_OPTIMIZATION(t4 PRIMARY) */ /*+ QB_NAME(qb2) */
+
SELECTUPDATEINSERTREPLACEDELETE
SELECT /*+ ... */ ... INSERT /*+ ... */ ... REPLACE /*+ ... */ ... UPDATE /*+ ... */ ... DELETE /*+ ... */ ...
(SELECT /*+ ... */ ... ) (SELECT ... ) UNION (SELECT /*+ ... */ ... ) (SELECT /*+ ... */ ... ) UNION (SELECT /*+ ... */ ... ) UPDATE ... WHERE x IN (SELECT /*+ ... */ ...) INSERT ... SELECT /*+ ... */ ...
EXPLAIN
解释选择/ *…*解释更新/…在X(选择/ *…* /…) 
EXPLAINSHOW WARNINGSEXPLAINSHOW
              WARNINGS
SELECT /*+ BNL(t1) BKA(t2) */ ...
SELECT /*+ BNL(t1) */ /* BKA(t2) */ ...
/*+ MRR(idx1)
              MRR(idx1) */
/*+
              MRR(idx1) NO_MRR(idx1) */
JOIN_FIXED_ORDER
hint_name([ @ query_block_name]) 
hint_name([@query_block_name]tbl_name[,tbl_name] ...)hint_name(tbl_name[@query_block_name] [,tbl_name[@query_block_name]] ...)
hint_name
JOIN_FIXED_ORDERSELECT
                  STRAIGHT_JOIN
JOIN_ORDER
JOIN_PREFIX
JOIN_SUFFIX
tbl_nameFROM
query_block_namequery_block_nametbl_namequery_block_name
SELECT
/*+ JOIN_PREFIX(t2, t5@subq2, t4@subq1)
    JOIN_ORDER(t4@subq1, t3)
    JOIN_SUFFIX(t1) */
COUNT(*) FROM t1 JOIN t2 JOIN t3
           WHERE t1.f1 IN (SELECT /*+ QB_NAME(subq1) */ f1 FROM t4)
             AND t2.f1 IN (SELECT /*+ QB_NAME(subq2) */ f1 FROM t5);
subq1t4@subq1t4@subq1
JOIN_PREFIXJOIN_ORDER
/*+ JOIN_PREFIX(t1) JOIN_PREFIX(t2) */
JOIN_PREFIX
/ * join_prefix(T1)join_suffix(T2)* / 
/*+ JOIN_ORDER(t1, t2) JOIN_ORDER(t2, t3) */
JOIN_ORDER
SELECT /*+ JOIN_ORDER(t1, t2) JOIN_PREFIX(t2, t1) */ ... FROM t1, t2;
/*+ JOIN_ORDER(t1, t2) JOIN_PREFIX(t2, t1) */
JOIN_ORDERt1t1EXPLAIN
const
constconst
如果您已经注册了,请先登录。 const_tbl同时,_阶(T2),T1,T2) 
EXPLAIN
LEFTINNERSTRAIGHT_JOIN
SELECT /*+ JOIN_PREFIX(t1, t2) */FROM t2 LEFT JOIN t1;
LEFT
              JOIN
hint_name([@query_block_name] [tbl_name[,tbl_name] ...])hint_name([tbl_name@query_block_name[,tbl_name@query_block_name] ...])
hint_name
tbl_name
query_block_namequery_block_nametbl_namequery_block_name
SELECT /*+ NO_BKA(t1, t2) */ t1.* FROM t1 INNER JOIN t2 INNER JOIN t3; SELECT /*+ NO_BNL() BKA(t1) */ t1.* FROM t1 INNER JOIN t2 INNER JOIN t3; SELECT /*+ NO_MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;
SELECT /*+ BNL(t2) */ FROM t1, t2;
t1t1t2
MERGE
derived_mergeoptimizer_switch
ALGORITHM={MERGE|TEMPTABLE}
hint_name([@query_block_name]tbl_name[index_name[,index_name] ...])hint_name(tbl_name@query_block_name[index_name[,index_name] ...])
hint_name
INDEX_MERGE
INDEX_MERGE
NO_INDEX_MERGE
MRRInnoDB
NO_ICP
NO_RANGE_OPTIMIZATION
SKIP_SCAN
SKIP_SCAN
NO_SKIP_SCAN
tbl_name
index_name
PRIMARYSHOW INDEX
query_block_namequery_block_nametbl_namequery_block_name
SELECT /*+ INDEX_MERGE(t1 f3, PRIMARY) */ f2 FROM t1 WHERE f1 = 'o' AND f2 = f3 AND f3 <= 4; SELECT /*+ MRR(t1) */ * FROM t1 WHERE f2 <= 3 AND 3 <= f3; SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY, f2_idx) */ f1 FROM t3 WHERE f1 > 30 AND f1 < 33; INSERT INTO t3(f1, f2, f3) (SELECT /*+ NO_ICP(t2) */ t2.f1, t2.f2, t2.f3 FROM t1,t2 WHERE t1.f1=t2.f1 AND t2.f2 BETWEEN t1.f1 AND t1.f2 AND t2.f2 + 1 >= t1.f1 + 1); SELECT /*+ SKIP_SCAN(t1 PRIMARY) */ f1, f2 FROM t1 WHERE f2 > 40;
optimizer_switch
t1bdi_bac
SELECT /*+ INDEX_MERGE(t1 i_a, i_b, i_c)*/ * FROM t1 WHERE a = 1 AND b = 2 AND c = 3 AND d = 4;
(i_a, i_b, i_c)
SELECT /*+ INDEX_MERGE(t1 i_a, i_b, i_c)*/ * FROM t1 WHERE b = 1 AND c = 2 AND d = 3;
(i_b, i_c)
_合并/ *指数(T1 _ I,I _ B)没有_ _合并指数(T1 _ * / I B) 
NO_INDEX_MERGE
/ *没有_ _合并指数(T1 _ I,I _(b)_合并指数(T1 _ * / I B) 
INDEX_MERGE
INDEX_MERGE
optimizer_switch
SET optimizer_switch='index_merge_intersection=off';SELECT /*+ INDEX_MERGE(t1 i_b, i_c) */ * FROM t1WHERE b = 1 AND c = 2 AND d = 3;
optimizer_switch
SET optimizer_switch='index_merge_intersection=on'; SELECT /*+ INDEX_MERGE(t1 i_b) */ * FROM t1 WHERE b = 1 AND c = 2 AND d = 3;
optimizer_switch
SET optimizer_switch='index_merge_intersection=off'; SELECT /*+ INDEX_MERGE(t1 i_b) */ * FROM t1 WHERE b = 1 AND c = 2 AND d = 3;
optimizer_switch
USE INDEXIGNORE INDEXNO_INDEX_MERGE
/* INDEX_MERGE(t1 i_a, i_b, i_c) */ ... 不知道索引 
IGNORE INDEXi_a
/ * noérère index aramée(t1 ièmeème a,i?b)* /…力量指数 
i_a, i_bi_arangeref
IGNORE INDEX
FORCE INDEX
SELECT /*+ INDEX_MERGE(t1 i_a, i_b, i_c) */ a FROM t1 FORCE INDEX (i_a, i_b) WHERE c = 'h' AND a = 2 AND b = 'b';
(i_a, i_b)USE
              INDEX
IN
hint_name([@query_block_name] [strategy[,strategy] ...])
hint_name
SEMIJOIN
strategyFIRSTMATCHMATERIALIZATION
SEMIJOINoptimizer_switch
NO_SEMIJOIN
SEMIJOIN
DUPSWEEDOUToptimizer_prune_level=0
SELECT /*+ NO_SEMIJOIN(@subq1 FIRSTMATCH, LOOSESCAN) */ * FROM t2 WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ a FROM t3); SELECT /*+ SEMIJOIN(@subq1 MATERIALIZATION, DUPSWEEDOUT) */ * FROM t2 WHERE t2.a IN (SELECT /*+ QB_NAME(subq1) */ a FROM t3);
IN
SUBQUERY([@query_block_name]strategy)
SUBQUERY
SUBQUERYstrategyMATERIALIZATION
SELECT id, a IN (SELECT /*+ SUBQUERY(MATERIALIZATION) */ a FROM t1) FROM t2; SELECT * FROM t2 WHERE t2.a IN (SELECT /*+ SUBQUERY(INTOEXISTS) */ a FROM t1);
SUBQUERYquery_block_namequery_block_name
MAX_EXECUTION_TIMESELECTN
最高的执行时间 N) 
SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 WHERE ...
MAX_EXECUTION_TIME(N)NNmax_execution_time
MAX_EXECUTION_TIME
SET_VAR
SELECT /*+ SET_VAR(sort_buffer_size = 16M) */ name FROM people ORDER BY name;INSERT /*+ SET_VAR(foreign_key_checks=OFF) */ INTO t2 VALUES(2);SELECT /*+ SET_VAR(optimizer_switch = 'mrr_cost_based=off') */ 1;
SET_VAR
set_var( var_name=value) 
var_namevalue
SET_VAR
MySQL的> SELECT @@unique_checks;----------------- | @ @独特的_ - | ----------------- | 1 | ----------------- mysql > SELECT /*+ SET_VAR(unique_checks=OFF) */ @@unique_checks;----------------- | @ @独特的_ - | ----------------- | 0 | ----------------- mysql > SELECT @@unique_checks;----------------- | @ @ unique_checks | ----------------- | 1 | ----------------- 
SET_VAR
SET @saved_val = @@session.var_name集@ @会议 var_name=value;选择设置@ @会议。 var_name= @saved_val;
SELECT /*+ SET_VAR(var_name=value) ...
SET
设置会话 var_name=value集@ @会议 var_name=value;设置@ @ var_name=value; 
SET_VAR@@session.SET_VAR
SET_VARSET_VAR
MySQL的> SELECT /*+ SET_VAR(collation_server = 'utf8') */ 1;--- | 1 | --- | 1 | --- 1行集,1报警(0秒)MySQL > SHOW WARNINGS\G*************************** 1。行***************************水平:报警代码:4537message:变“collation_server”不能使用set_var暗示。 
SET_VAR
SELECT /*+ SET_VAR(optimizer_switch = 'mrr_cost_based=off') SET_VAR(max_heap_table_size = 1G) */ 1;
SELECT /*+ SET_VAR(max_heap_table_size = 1G)
           SET_VAR(max_heap_table_size = 3G) */ 1;
SET_VAR
SELECT /*+ SET_VAR(max_size = 1G) */ 1;SELECT /*+ SET_VAR(optimizer_switch = 'mrr_cost_based=yes') */ 1;
max_sizeonyes
SET_VAR
SET_VAR
RESOURCE_GROUPRESOURCE_GROUP_ADMINRESOURCE_GROUP_USER
SELECT /*+ RESOURCE_GROUP(USR_default) */ name FROM people ORDER BY name; INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);
RESOURCE_GROUP
resource_group( group_name) 
group_name
RESOURCE_GROUPINSERTUPDATE
RESOURCE_GROUPSET RESOURCE GROUP
QB_NAME
qb_name( name) 
QB_NAME
选择从(选择…从(选择…从…))… 
QB_NAME
选择/ * * / qb_name(QB1)…从(选择/ * * / qb_name(qb2)…从(选择/ * * / qb_name(QB3)…从…))… 
SELECT /*+ QB_NAME(qb1) MRR(@qb1 t1) BKA(@qb2) NO_MRR(@qb3t1 idx1, id2) */ ... FROM (SELECT /*+ QB_NAME(qb2) */ ... FROM (SELECT /*+ QB_NAME(qb3) */ ... FROM ...)) ...
MRR(@qb1 t1)qb1
BKA(@qb2)
NO_MRR(@qb3 t1 idx1, id2)idx2qb3
SELECT /*+ BKA(@`my hint name`) */ ... FROM (SELECT /*+ QB_NAME(`my hint name`) */ ...) ...
ANSI_QUOTES
选择/ * BKA(@”我的暗示的名字”)* /…从(选择/ * qb_name(“我的暗示的名字”)* /…)… 
optimizer_switchoff
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,
                    index_merge_sort_union=on,
                    index_merge_intersection=on,
                    engine_condition_pushdown=on,
                    index_condition_pushdown=on,
                    mrr=on,mrr_cost_based=on,
                    block_nested_loop=on,batched_key_access=off,
                    materialization=on,semijoin=on,loosescan=on,
                    firstmatch=on,duplicateweedout=on,
                    subquery_materialization_cost_based=on,
                    use_index_extensions=on,
                    condition_fanout_filter=on,derived_merge=on,
                    use_invisible_indexes=off,skip_scan=on
optimizer_switch
SET [GLOBAL|SESSION] optimizer_switch='command【, command]…”; 
command
| default | |
|  | |
|  | |
|  | 
defaultopt_nameonopt_nameoptimizer_switch
opt_name
batched_key_access
batched_key_accessmrrmrr_cost_based
block_nested_loop
condition_fanout_filter
derived_merge
derived_mergederived_merge
engine_condition_pushdown
index_condition_pushdown
use_index_extensions
index_merge
index_merge_intersection
index_merge_sort_union
index_merge_union
use_invisible_indexes
mrr
mrr_cost_based
mrr=on
skip_scan
semijoin
duplicateweedout
firstmatch
loosescan
GROUP
                BY
semijoinloosescansemijoinfirstmatch
duplicateweedout
semijoinon
materialization
subquery_materialization_cost_based
materializationmaterializationon
subquery_materialization_cost_basedEXISTSINoffEXISTS
optimizer_switch
MySQL的> SELECT @@optimizer_switch\G*************************** 1. row ***************************@@optimizer_switch: index_merge=on,index_merge_union=on, index_merge_sort_union=on, index_merge_intersection=on, engine_condition_pushdown=on, index_condition_pushdown=on, mrr=on,mrr_cost_based=on, block_nested_loop=on,batched_key_access=off, materialization=on,semijoin=on,loosescan=on, firstmatch=on, subquery_materialization_cost_based=on, use_index_extensions=on, condition_fanout_filter=on
mysql>SET optimizer_switch='index_merge_union=off,index_merge_sort_union=off';mysql>SELECT @@optimizer_switch\G*************************** 1. row *************************** @@optimizer_switch: index_merge=on,index_merge_union=off, index_merge_sort_union=off, index_merge_intersection=on, engine_condition_pushdown=on, index_condition_pushdown=on, mrr=on,mrr_cost_based=on, block_nested_loop=on,batched_key_access=off, materialization=on,semijoin=on,loosescan=on, firstmatch=on, subquery_materialization_cost_based=on, use_index_extensions=on, condition_fanout_filter=on
SELECTUPDATE
SELECT
tbl_name[[AS]alias] [index_hint_list]index_hint_list:index_hint[index_hint] ...index_hint: USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list]) | IGNORE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list) | FORCE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)index_list:index_name[,index_name] ...
USE INDEX
        (index_list)index_listEXPLAIN
FORCE INDEXindex_list
PRIMARYSHOW
        INDEXINFORMATION_SCHEMA.STATISTICS
index_name
SELECT * FROM table1 USE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3; SELECT * FROM table1 IGNORE INDEX (col3_index) WHERE col1=1 AND col2=2 AND col3=3;
index_listindex_listIGNORE
            INDEX
FORFOR ORDER BY
SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;
SELECT * FROM t1 USE INDEX (i1) USE INDEX (i1,i1);
USE INDEX
SELECT * FROM t1 USE INDEX FOR JOIN (i1) FORCE INDEX FOR JOIN (i2);
FOR
不知道索引(I1) 
IGNORE INDEX FOR JOIN (i1) IGNORE INDEX FOR ORDER BY (i1) IGNORE INDEX FOR GROUP BY (i1)
FORold
USEIGNOREFOR ORDER BY
SELECT * FROM t1 USE INDEX () IGNORE INDEX (i2) USE INDEX (i1) USE INDEX (i2);
SELECT * FROM t1 USE INDEX (i1,i2) IGNORE INDEX (i2);
{USE|FORCE} INDEX
IGNORE INDEX
SELECT * FROM T1使用索引(I1)忽略指数(I2)利用指数(I2);选择*从T1使用索引(I1); 
FULLTEXT
IGNORE INDEX(i1)
FOR
            ORDER BYFOR
            JOINFULLTEXT
SELECT * FROM t USE INDEX (index1) IGNORE INDEX (index1) FOR ORDER BY IGNORE INDEX (index1) FOR GROUP BY WHERE ... IN BOOLEAN MODE ... ; SELECT * FROM t USE INDEX (index1) WHERE ... IN BOOLEAN MODE ... ;
server_costmysql
NULL
FLUSH OPTIMIZER_COSTS
NULLFLUSH
              OPTIMIZER_COSTS
mysql
server_cost
cost_name
cost_value
NULL
NULLNULLFLUSH
              OPTIMIZER_COSTS
last_update
comment
default_value
NULL
server_cost
cost_name
disk_temptable_create_cost
InnoDB
memory_temptable_create_cost
key_compare_cost
filesort
memory_temptable_create_cost
MEMORY
disk_temptable_create_cost
row_evaluate_cost
engine_cost
engine_name
default
device_type
cost_name
server_cost
cost_value
server_cost
last_update
server_cost
comment
server_cost
default_value
NULLdefault_value
engine_costengine_name
cost_name
io_block_read_cost
memory_block_read_cost
io_block_read_cost
io_block_read_cost
io_block_read_costio_block_read_cost
io_block_read_cost
UPDATE mysql.engine_cost SET cost_value = 2.0 WHERE cost_name = 'io_block_read_cost';FLUSH OPTIMIZER_COSTS;
io_block_read_cost
INSERT INTO mysql.engine_cost
  VALUES ('InnoDB', 0, 'io_block_read_cost', 3.0,
  CURRENT_TIMESTAMP, 'Using a slower disk for InnoDB');
FLUSH OPTIMIZER_COSTS;
column_statisticsANALYZE
        TABLE
column_statistics
JSON
column_statisticsINFORMATION_SCHEMA.COLUMN_STATISTICSCOLUMN_STATISTICS
SCHEMA_NAMECOLUMN_NAME
HISTOGRAMJSON
JSON
{“桶”:[ [ 1,0.3333333333333333 ],[ 2,0.6666666666666666 ],[ 3,1 ] ],“空值”:0,“最近更新”:“2017-03-24 13:32:40. 000000”、“采样率”:1、“直方图”型:“独生子女”、“斗指定”编号:128,“数据类型”:“int”、“整理ID”:8 } 
buckets
singleton
equi-height
null-valuesNULL
last-updatedYYYY-MM-DD
            HH:MM:SS.hhmmss
sampling-rate
histogram-type
singletonANALYZE TABLE
equi-heightANALYZE TABLE
number-of-buckets-specifiedANALYZE
            TABLE
data-typeuintdecimalstring
collation-idstringINFORMATION_SCHEMA.COLLATIONS
JSON
MySQL的> SELECTTABLE_NAME, COLUMN_NAME,HISTOGRAM->>'$."data-type"' AS 'data-type',JSON_LENGTH(HISTOGRAM->>'$."buckets"') AS 'bucket-count'FROM INFORMATION_SCHEMA.COLUMN_STATISTICS;----------------- ------------- ----------- -------------- | table_name | column_name |数据类型|桶数| ----------------- ------------- ----------- -------------- |国|人口| int | 226 | |市|人口| int | 1024 | | countrylanguage |语言|字符串| 457 | ----------------- ------------- ----------- -------------- 
col_name=constantcol_name<>constantcol_name!=constantcol_name>constantcol_name<constantcol_name>=constantcol_name<=constantcol_nameIS NULLcol_nameIS NOT NULLcol_nameBETWEENconstantANDconstantcol_nameNOT BETWEENconstantANDconstantcol_nameIN (constant[,constant] ...)col_nameNOT IN (constant[,constant] ...)
SELECT * FROM orders WHERE amount BETWEEN 100.0 AND 300.0; SELECT * FROM tbl WHERE col1 = 15 AND col2 > 100;
ABS()FLOOR()
SELECT * FROM tbl WHERE col1 < ABS(-34);
ANALYZE
        TABLE
ANALYZE TABLEoptimizer_switch
SET optimizer_switch='condition_fanout_filter=off';
EXPLAIN
SELECT * FROM t1 WHERE col1 < 24;
t1col1 <        24EXPLAIN
InnoDBInnoDB
InnoDB
InnoDB
MyISAM
MyISAM
key_buffer_sizekey_buffer_size
MyISAM
InnoDB
MyISAMCACHE INDEXt1t3
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table   | Op                 | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status   | OK       |
| test.t2 | assign_to_keycache | status   | OK       |
| test.t3 | assign_to_keycache | status   | OK       |
+---------+--------------------+----------+----------+
CACHE
          INDEXSET
          GLOBAL
MySQL的> SET GLOBAL keycache1.key_buffer_size=128*1024;
mysql> SET GLOBAL keycache1.key_buffer_size=0;
mysql>SET GLOBAL key_buffer_size = 0;mysql>SHOW VARIABLES LIKE 'key_buffer_size';+-----------------+---------+ | Variable_name | Value | +-----------------+---------+ | key_buffer_size | 8384512 | +-----------------+---------+
keycache1.key_buffer_sizekey_buffer_size
CACHE INDEXCACHE INDEX
key_buffer_size = 4Ghot_cache.key_buffer_size = 2Gcold_cache.key_buffer_size = 2Ginit_file=/path/ to/ data-directory/ mysqld_init.sql 
mysqld_init.sqlcold_cache
db1.t1索引缓存,在缓存缓存db1.t2,db2.t3 _指数db1.t4 db2.t5热,冷,db2.t6 _缓存 
key_cache_division_limitkey_cache_division_limit
key_cache_age_threshold
NN
key_cache_division_limit
key_cache_division_limit
LOAD INDEX INTO
          CACHEt2
MySQL的> LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES;--------- -------------- ---------- ---------- |表| OP | msg_type | msg_text | --------- -------------- ---------- ---------- | test.t1 | preload_keys |状态|好| | test.t2 | preload_keys |状态|好| --------- -------------- ---------- ---------- 
IGNORE LEAVESt2
CACHE INDEX
key_cache_block_size
.MYI--myisam-block-size
mysql> SET GLOBAL cold_cache.key_buffer_size=4*1024*1024;
key_buffer_sizekey_cache_block_size
PREPAREmysql_stmt_prepare()max_prepared_stmt_count
stored_program_cache
INSERTUPDATESELECT
PREPARE s1 FROM 'SELECT * FROM t1';
SELECT *s1
FLUSH
        TABLES
DECLARE CURSORIFCASERETURN
SELECT *
CASE
案例 case_expr什么时候 when_expr1…什么时候 when_expr2…什么时候 when_expr3…最后的案例… 
WHEN
            when_expr3case_expr
Com_stmt_reprepare
MyISAM
InnoDB
InnoDBInnoDB
innodb_lock_wait_timeoutinnodb_deadlock_detect
MyISAMMERGE
GROUP BY
SELECTSELECT
Table_locks_immediateTable_locks_waited
MySQL的> SHOW STATUS LIKE 'Table%';----------------------- --------- | variable_name |价值| ----------------------- --------- | table_locks_immediate | 1151552 | | table_locks_waited | 15324 | ----------------------- --------- 
MyISAMINSERTSELECTMyISAMconcurrent_insert
LOCK TABLESREAD
INSERTSELECTtemp_t1
MySQL的> LOCK TABLES t1 WRITE, temp_t1 WRITE;MySQL的> INSERT INTO t1 SELECT * FROM temp_t1;MySQL的> DELETE FROM temp_t1;MySQL的> UNLOCK TABLES;
GET_LOCK()RELEASE_LOCK()
InnoDBLOCK TABLES
InnoDB
InnoDB
InnoDBCREATE TABLE ... ENGINE=INNODBALTER TABLE ...
              ENGINE=INNODB
SELECT
--low-priority-updatesMEMORYSELECTSELECTUPDATESELECT
low_priority_updates
SELECT
max_write_lock_countSELECTWRITE
INSERTSELECTSELECTINSERT
SELECTDELETEDELETE
SQL_BUFFER_RESULTSELECT
mysys/thr_lock.c
MyISAMINSERTSELECTINSERTSELECTINSERT
concurrent_insertconcurrent_insertALWAYSconcurrent_insert
CREATE ...
        SELECTINSERT ...
        SELECT
LOAD DATA
        INFILEMyISAMLOAD DATALOAD
        DATA
HIGH_PRIORITY--low-priority-updates
LOCK
        TABLEREADINSERT
LOCK_open
t
START TRANSACTION; SELECT * FROM t; SELECT * FROM nt;
t
DROP TABLE t; ALTER TABLE t ...; DROP TABLE nt; ALTER TABLE nt ...; LOCK TABLE t ... WRITE;
LOCK TABLES ...
        READ
PREPARE
PREPAREDXA COMMITXA RECOVER
MyISAM
MyISAMMyISAM
CHECK TABLEREPAIR TABLEMyISAM
skip_external_locking
--external-locking--skip-external-locking
MyISAM--delay-key-write=ALLDELAY_KEY_WRITE=1
--external-locking--delay-key-write=OFF
InnoDB
MyISAM
InnoDB
NNnumber_of_disks
NN
NN
-o noatime
-o
            async
hard
InnoDBCREATE
        TABLE
MyISAM
SHOW VARIABLES LIKE 'datadir';
shell>mkdir /dr1/databases/testshell>ln -s /dr1/databases/test/path/to/datadir
db1db1
内核> cd/path/to/datadir内核> ln -s db1 db2
tbl_atbl_adb1.tbl_a
--symbolic-links
MyISAM
realpath()have_symlink
显示变量的have_symlink”; 
MyISAM
.MYD
DATA DIRECTORYCREATE TABLE
DATA
                DIRECTORYdata
ALTER TABLEOPTIMIZE TABLEREPAIR TABLE
root
ALTER TABLE
              ... RENAMERENAME
              TABLE
ALTER TABLE
              ... RENAMERENAME
              TABLE
--skip-symbolic-links
ALTER TABLEINDEX
              DIRECTORY
mydbD:\data\mydbmydb
C:\> cd \path\to\datadir
mydb
C:\ > mklink /d mydb D:\data\mydb
mydb
InnoDB
InnoDBinnodb_buffer_pool_sizeinnodb_buffer_pool_sizeinnodb_buffer_pool_size
innodb_buffer_pool_instances
InnoDB
MyISAMkey_buffer_size
MyISAMNNBLOBBLOBBLOB
myisam_use_mmap
tmp_table_sizemax_heap_table_sizeinternal_tmp_disk_storage_engine
MEMORYCREATE TABLEmax_heap_table_size
thread_stack
net_buffer_length
net_buffer_length
net_buffer_lengthmax_allowed_packetnet_buffer_length
max_digest_length
read_buffer_size
read_rnd_buffer_size
BLOB
table_open_cache
table_definition_cache
FLUSH TABLESFLUSH TABLES
GRANTCREATE USERCREATE SERVERINSTALL PLUGINREVOKEDROP USERDROP SERVERUNINSTALL PLUGINFLUSH PRIVILEGES
max_allowed_packet
slave_pending_jobs_size_max
rpl_read_size
binlog_transaction_dependency_history_size
max_binlog_cache_size
max_binlog_stmt_cache_size
swap -s
ENABLEDsetup_instrumentscode_areainstrument_namecode_areainnodbinstrument_name
setup_instruments
MySQL的> SELECT * FROM performance_schema.setup_instrumentsWHERE NAME LIKE '%memory%';
InnoDB
mysql>SELECT * FROM performance_schema.setup_instrumentsWHERE NAME LIKE '%memory/innodb%';+-------------------------------------------+---------+-------+ | NAME | ENABLED | TIMED | +-------------------------------------------+---------+-------+ | memory/innodb/adaptive hash index | NO | NO | | memory/innodb/buf_buf_pool | NO | NO | | memory/innodb/dict_stats_bg_recalc_pool_t | NO | NO | | memory/innodb/dict_stats_index_map_t | NO | NO | | memory/innodb/dict_stats_n_diff_on_level | NO | NO | | memory/innodb/other | NO | NO | | memory/innodb/row_log_buf | NO | NO | | memory/innodb/row_merge_sort | NO | NO | | memory/innodb/std | NO | NO | | memory/innodb/trx_sys_t::rw_trx_ids | NO | NO | ...
performance_schemaclientmyisammemoryarchive
performance-schema-instrument
performance-schema-instrument='memory/%=COUNTED'
ENABLEDsetup_instrumentsTIMEDsetup_instruments
MySQL的> SELECT * FROM performance_schema.setup_instrumentsWHERE NAME LIKE '%memory/innodb%';------------------------------------------- --------- ------- |名字|启用|定时| ------------------------------------------- --------- ------- |记忆/会/自适应哈希索引|没有|没有| |记忆/ InnoDB / buf_buf_pool |没有|没有| |记忆/ InnoDB / dict_stats_bg_recalc_pool_t |没有|没有| |记忆/ InnoDB / dict_stats_index_map_t |没有|没有| |记忆/会/ dict_stats_n_diff_on_level |没有|没有| |记忆/会/其他|没有|没有| |记忆/ InnoDB / row_log_buf |没有|没有| |记忆/ InnoDB / row_merge_sort |没有|没有| |记忆/会/性病|没有|没有| |记忆/会/ trx_sys_t::rw_trx_ids |没有|没有|… 
memory_summary_global_by_event_nameEVENT_NAME
InnoDB
mysql>SELECT * FROM performance_schema.memory_summary_global_by_event_nameWHERE EVENT_NAME LIKE 'memory/innodb/buf_buf_pool'\GEVENT_NAME: memory/innodb/buf_buf_pool COUNT_ALLOC: 1 COUNT_FREE: 0 SUM_NUMBER_OF_BYTES_ALLOC: 137428992 SUM_NUMBER_OF_BYTES_FREE: 0 LOW_COUNT_USED: 0 CURRENT_COUNT_USED: 1 HIGH_COUNT_USED: 1 LOW_NUMBER_OF_BYTES_USED: 0 CURRENT_NUMBER_OF_BYTES_USED: 137428992 HIGH_NUMBER_OF_BYTES_USED: 137428992
sysmemory_global_by_current_bytes
MySQL的> SELECT * FROM sys.memory_global_by_current_bytesWHERE event_name LIKE 'memory/innodb/buf_buf_pool'\G*************************** 1。行*************************** event_name:记忆/会/ buf_buf_pool current_count:1 current_alloc:131.06 mibcurrent_avg_alloc:131.06 MIB high_count:1 high_alloc:131.06 MIB high_avg_alloc:131.06 MIB 
sys
mysql>SELECT SUBSTRING_INDEX(event_name,'/',2) AScode_area, sys.format_bytes(SUM(current_alloc))AS current_allocFROM sys.x$memory_global_by_current_bytesGROUP BY SUBSTRING_INDEX(event_name,'/',2)ORDER BY SUM(current_alloc) DESC;+---------------------------+---------------+ | code_area | current_alloc | +---------------------------+---------------+ | memory/innodb | 843.24 MiB | | memory/performance_schema | 81.29 MiB | | memory/mysys | 8.20 MiB | | memory/sql | 2.47 MiB | | memory/memory | 174.01 KiB | | memory/myisam | 46.53 KiB | | memory/blackhole | 512 bytes | | memory/federated | 512 bytes | | memory/csv | 512 bytes | | memory/vio | 496 bytes | +---------------------------+---------------+
sys
--super-large-pages--skip-super-large-pages
Documentation/vm/hugetlbpage.txt
shell> cat /proc/meminfo | grep -i huge
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       4096 kB
hugetlbpage.txt
rc
# Set the number of pages to be used.# Each page is normally 2MB, so a value of 20 = 40MB.# This command actually allocates memory, so this much# memory must be available.echo 20 > /proc/sys/vm/nr_hugepages# Set the group number that is permitted to access this# memory (102 in this case). The mysql user must be a# member of this group.echo 102 > /proc/sys/vm/hugetlb_shm_group# Increase the amount of shmem permitted per segment# (12G in this case).echo 1560281088 > /proc/sys/kernel/shmmax# Increase total amount of shared memory. The value# is the number of pages. At 4KB/page, 4194304 = 16GB.echo 4194304 > /proc/sys/kernel/shmall
shmmax
/proc/meminfo
内核> cat /proc/meminfo | grep -i hugehugepages_total:20hugepages_free:20hugepages_rsvd:0hugepages_surp:0hugepagesize:4096 KB 
hugetlb_shm_group/etc/security/limits.conf
ulimit -l unlimited
rootmysqlroot
--large-pages
[mysqld] large-pages
InnoDB
/proc/meminfo
内核> cat /proc/meminfo | grep -i hugehugepages_total:20hugepages_free:20hugepages_rsvd:2hugepages_surp:0hugepagesize:4096 KB 
thread_cache_sizethread_cache_sizeNNthread_cache_size
Threads_cachedThreads_created
max_connections
N--thread_stack=N
host_cacheSELECT
max_connect_errors
127.0.0.1
NULL
NULL
gethostbyaddr()
FLUSH HOSTS
FLUSH HOSTS
host_cache_size
--skip-name-resolve
--skip-name-resolvehost_cache_size
--skip-networking
Connection_errors_xxx
Batch
INFORMATION_SCHEMA.RESOURCE_GROUPSthreads
SYSTEM
threads
SYS_default
SYS_default
RESOURCE_GROUP_ADMIN
RESOURCE_GROUP
RESOURCE_GROUP_ADMINRESOURCE_GROUP_USER
resource_groupsINFORMATION_SCHEMA.RESOURCE_GROUPS
RESOURCE_GROUPS
MySQL的> SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS\G*************************** 1。行*************************** resource_group_name:usr_default resource_group_type:userresource_group_enabled:1 vcpu_ids:0-3 thread_priority:0 *************************** 2。行*************************** resource_group_name:sys_default resource_group_type:systemresource_group_enabled:1 vcpu_ids:0-3 thread_priority:0 
THREAD_PRIORITY
Batch
CREATE RESOURCE GROUP Batch TYPE = USER VCPU = 2-3 -- assumes a system with at least 4 CPUs THREAD_PRIORITY = 10;
RESOURCE_GROUPS
MySQL的> SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPSWHERE RESOURCE_GROUP_NAME = 'Batch'\G*************************** 1。行*************************** resource_group_name:批resource_group_type:userresource_group_enabled:1 vcpu_ids:2-3 thread_priority:10 
THREAD_PRIORITY
Batch
设置资源组批 thread_id; 
Batch
Batch
设置资源组批; 
Batch
Batch
INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);
Batch
ALTER RESOURCE GROUP Batch VCPU = 3 THREAD_PRIORITY = 19;
ALTER RESOURCE GROUP Batch VCPU = 0-3 THREAD_PRIORITY = 0;
mysql>ALTER RESOURCE GROUP abc THREAD_PRIORITY = 10;Query OK, 0 rows affected, 1 warning (0.18 sec) mysql>SHOW WARNINGS;+---------+------+-------------------------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------------------------+ | Warning | 4560 | Attribute thread_priority is ignored (using default value). | +---------+------+-------------------------------------------------------------+
CAP_SYS_NICECAP_SYS_NICE
shell>sudo setcap cap_sys_nice+ep ./bin/mysqldshell>getcap ./bin/mysqld./bin/mysqld = cap_sys_nice+ep
| THREAD_PRIORITY_HIGHEST | |
| THREAD_PRIORITY_ABOVE_NORMAL | |
| THREAD_PRIORITY_NORMAL | |
| THREAD_PRIORITY_BELOW_NORMAL | |
| THREAD_PRIORITY_LOWEST | 
InnoDB
BENCHMARK()BENCHMARK(loop_count,expression)
mysql> SELECT BENCHMARK(1000000,1+1);
+------------------------+
| BENCHMARK(1000000,1+1) |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.32 sec)
BENCHMARK()
performance_schema
SHOW [FULL] PROCESSLIST
INFORMATION_SCHEMAPROCESSLIST
threads
threadsINFORMATION_SCHEMA.PROCESSLISTSHOW PROCESSLISTthreadsINFORMATION_SCHEMA.PROCESSLISTSHOW PROCESSLISTthreads
PROCESS
Id
User
db
Command
TimeSET
          TIMESTAMP = value
InfoSHOW FULL
          PROCESSLIST
sysprocesslistthreads
syssessionprocesslist
Command
Command
State
MyISAMANALYZE TABLE
MEMORY
ALTER
            TABLE
ORDER BY
ALTER TABLE
ALTER TABLE ... ENABLE
            KEYS
SELECT
Copying to tmp table on
            disk
committing alter table to storage engine
ALTER TABLE
deleting from reference tables
ALTER TABLE ... DISCARD
            TABLESPACE
ALTER TABLECREATE VIEWDELETEINSERTSELECTUPDATE
init_command
cleaning up
ALTER TABLEDELETEINSERTSELECTUPDATE
end
KILL
SHOW
            PROCESSLIST
ALTER TABLELOCK
            TABLEtable_open_cache
Opening system
            tables
freeing items
SELECT
            DISTINCT
SELECT
ALTER
            TABLE
ALTER TABLE
MyISAM
Repair by
            sorting
MyISAMAUTO_INCREMENT
UPDATE
Sending data
SELECT
ALTER
            TABLE
GROUP
            BY
ORDER
            BY
MyISAM
SELECT
mysql_lock_tables()
InnoDBLOCK TABLESMyISAM--skip-external-lockingSHOW PROFILE
Locking system
            tables
GET_LOCK()SHOW PROFILE
SLEEP()
FLUSH TABLES WITH READ LOCK
FLUSH TABLES WITH READ LOCKread_only
FLUSH TABLEStbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE
FLUSH
            TABLES
FLUSH TABLEStbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE
THR_LOCKlock_type
THR_LOCK
Waiting for table level lock
Waiting for event metadata lock
Waiting for global read lock
Waiting for schema metadata lock
Waiting for stored function metadata
                lock
Waiting for stored procedure metadata
                lock
Waiting for table metadata lock
Waiting for trigger metadata lock
StateBinlog Dump
Finished reading one binlog; switching to next
            binlog
Master has sent all binlog to slave; waiting for
            more updates
Waiting to finalize termination
StateSHOW SLAVE
        STATUS
Queueing master event to the relay log
Reconnecting after a failed binlog dump
            request
Reconnecting after a failed master event
            read
Waiting for master to send event
Waiting for its turn to commit
slave_preserve_commit_order
Waiting for master to send event
slave_net_timeout
Connecting to
            master
Waiting for slave mutex on exit
Waiting for the slave SQL thread to free enough
            relay log space
relay_log_space_limit
Waiting to reconnect after a failed binlog dump
            request
CHANGE MASTER TO
Waiting to reconnect after a failed master event
            read
CHANGE MASTER TO
State
STOP SLAVE
Making temporary file (append) before replaying
            LOAD DATA INFILE
LOAD DATA
            INFILE
Making temporary file (create) before replaying
            LOAD DATA INFILE
LOAD DATA
            INFILELOAD DATA
            INFILE
Reading event from the relay log
Slave has read all relay log; waiting for more
            updates
Waiting for an event from Coordinator
slave_parallel_workers
Waiting for slave mutex on exit
Waiting for Slave Workers to free pending
            events
slave_pending_jobs_size_maxslave_parallel_workers
Waiting for the next event in relay log
Reading event from the
            relay log
Waiting until MASTER_DELAY seconds after master
            executed event
MASTER_DELAYCHANGE MASTER TO
Info
CHANGE
            MASTER TO
STOP SLAVE
Creating table from master
            dump
Reading master dump table data
Opening master dump
            table
Rebuilding the index on master dump table
Reading master dump table
            data