MySQL各種小技巧(不定時更新)

1,into outfile 生成sql:一般都是生成文本或者其他形式的文件,現在需要生成sql形式的文件。

select concat('insert into tab_name(col1,col2,col3) values(',col1,',','\'',col2,'\'',',','\'',col3,'\'',')') into outfile '/tmp/tt.txt' from tt;

出來tt.txt的結果爲:

View Code
insert into tab_name(id,name,age) values(1,'aaa','23');
insert into tab_name(id,name,age) values(2,'aaa','23');
insert into tab_name(id,name,age) values(3,'aaa','23');
insert into tab_name(id,name,age) values(4,'aaa','23');
insert into tab_name(id,name,age) values(6,'aaa','23');

2,MySQL中like語句及相關優化器tips: 利用INNODB特性,來優化like '%%'的方法。

3,Mysqldump輸出方式和進度報告: 用這個mysqldump可以直接在備份的時候打印出進度。注意,需要有可執行權限和64位系統。

./mysqldump  -uroot -p -h192.168.1.11 --default-character-set=utf8 dbname tablename --result-file=table.sql  --progress-reportEnter 
current_table: dbname.tablename    Stage: 10%

4,在show processlist顯示的狀態裏面,update表示正在insert ,updating表示正在delete,Updating纔是表示正在update。

5,Innodb表,當表裏面有100行記錄,有自增ID。清除表裏的數據之後,重啓數據庫。發現表的自增ID重新計算,從0開始。MyISAM表不會。

View Code
root@localhost : test 05:12:51>show create table tte\G;
*************************** 1. row ***************************
       Table: tte
Create Table: CREATE TABLE `tte` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT
1 row in set (0.00 sec)

ERROR: 
No query specified

root@localhost : test 05:13:58>insert into tte(name,age,address) values('a',11,'hz'),('b',22,'gz'),('c',33,'bj');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

root@localhost : test 05:14:39>select * from tte;
+----+------+------+---------+
| id | name | age  | address |
+----+------+------+---------+
|  1 | a    |   11 | hz      |
|  2 | b    |   22 | gz      |
|  3 | c    |   33 | bj      |
+----+------+------+---------+
3 rows in set (0.00 sec)

root@localhost : test 05:14:44>show create table tte\G;
*************************** 1. row ***************************
       Table: tte
Create Table: CREATE TABLE `tte` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT
1 row in set (0.00 sec)

ERROR: 
No query specified

root@localhost : test 05:14:46>delete from tte;
Query OK, 3 rows affected (0.00 sec)

root@localhost : test 05:14:59>show create table tte\G;
*************************** 1. row ***************************
       Table: tte
Create Table: CREATE TABLE `tte` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT
1 row in set (0.00 sec)

ERROR: 
No query specified

root@localhost : test 05:15:04>\q
Bye
zhoujy@zhoujy:~$ sudo /etc/init.d/mysql restart
[sudo] password for zhoujy: 
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service mysql restart

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the stop(8) and then start(8) utilities,
e.g. stop mysql ; start mysql. The restart(8) utility is also available.
mysql stop/waiting
mysql start/running, process 5285
zhoujy@zhoujy:~$ mysql test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.67-0ubuntu0.11.10.1-log (Ubuntu)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

root@localhost : test 05:15:22>show create table tte\G;
*************************** 1. row ***************************
       Table: tte
Create Table: CREATE TABLE `tte` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT
1 row in set (0.00 sec)

ERROR: 
No query specified

root@localhost : test 05:15:24>insert into tte(name,age,address) values('a',11,'hz'),('b',22,'gz'),('c',33,'bj');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

root@localhost : test 05:15:37>select * from tte;
+----+------+------+---------+
| id | name | age  | address |
+----+------+------+---------+
|  1 | a    |   11 | hz      |
|  2 | b    |   22 | gz      |
|  3 | c    |   33 | bj      |
+----+------+------+---------+
3 rows in set (0.00 sec)

 6,MySQL中pager的使用:Pager的使用

 7,MySQL之 index_merge :當執行計劃出現索引合併時,可以修改optimizer_switch的一個狀態,棄用index_merge索引,慎用

set optimizer_switch = 'index_merge_union=off,index_merge_intersection=off,index_merge_sort_union=off';
View Code
root@localhost : test 02:09:32>explain select * From idx_mer where name='e' and name1 = 'ee'\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: idx_mer
         type: index_merge
possible_keys: idx_name,idx_name1
          key: idx_name1,idx_name
      key_len: 33,33
          ref: NULL
         rows: 1
        Extra: Using intersect(idx_name1,idx_name); Using where
1 row in set (0.00 sec)

root@localhost : test 02:09:36>set session optimizer_switch='index_merge_intersection=off';
Query OK, 0 rows affected (0.00 sec)

root@localhost : test 02:10:12>explain select * From idx_mer where name='e' and name1 = 'ee'\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: idx_mer
         type: ref
possible_keys: idx_name,idx_name1
          key: idx_name1
      key_len: 33
          ref: const
         rows: 2
        Extra: Using where
1 row in set (0.00 sec)

 8MySQL提示符設置:prompt

複製代碼
[client]
#在client組下面設置
prompt          = \\u@\\h : \\d \\r:\\m:\\s>
#屏幕輸出打印到指定位置
tee             = /home/mysql/query.log

效果:
root@localhost : test 09:54:37>
複製代碼

 9,MySQL隔離級別 read committed下的注意事項:在read committed/uncommitted 隔離級別下面,binlog 的 statement模式不被支持。

View Code
mysql> select @@global.tx_isolation,@@global.binlog_format;
+-----------------------+------------------------+
| @@global.tx_isolation | @@global.binlog_format |
+-----------------------+------------------------+
| READ-COMMITTED        | ROW                    |
+-----------------------+------------------------+
1 row in set (0.00 sec)

mysql> select @@session.tx_isolation,@@session.binlog_format;
+------------------------+-------------------------+
| @@session.tx_isolation | @@session.binlog_format |
+------------------------+-------------------------+
| READ-COMMITTED         | ROW                     |
+------------------------+-------------------------+
1 row in set (0.00 sec)

mysql> set session binlog_format='statement';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values(1,'test',1);            #在read committed/uncommitted 隔離級別下面,binlog 的 statement模式不被支持。
ERROR 1665 (HY000): Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.
mysql> select @@session.tx_isolation,@@session.binlog_format;
+------------------------+-------------------------+
| @@session.tx_isolation | @@session.binlog_format |
+------------------------+-------------------------+
| READ-COMMITTED         | STATEMENT               |
+------------------------+-------------------------+
1 row in set (0.00 sec)

mysql> set session transaction isolation level repeatable read,binlog_format = statement;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@session.tx_isolation,@@session.binlog_format;
+------------------------+-------------------------+
| @@session.tx_isolation | @@session.binlog_format |
+------------------------+-------------------------+
| REPEATABLE-READ        | STATEMENT               |
+------------------------+-------------------------+
1 row in set (0.00 sec)

mysql> insert into test values(1,'test',1);
Query OK, 1 row affected (0.00 sec)

10,innodb表加索引的限制:索引大小需要小於767個字節才能建立成功,767<size<3072:回報warnging,能建立成功但是會被截斷,size>3072:會直接報錯,不會建立索引。size:長度*字符集大小,如:varchar(10) utf8 則是10*3=30 bytes。

View Code
root@localhost : test 03:33:33>show create table tb\G;
*************************** 1. row ***************************
       Table: tb
Create Table: CREATE TABLE `tb` (
  `a` varchar(256) DEFAULT NULL,
  `b` varchar(2556) DEFAULT NULL,
  `c` varchar(256) DEFAULT NULL,
  `d` varchar(256) DEFAULT NULL,
  `e` varchar(256) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

root@localhost : test 03:33:43>alter table tb add index idx_all(a,b);
Query OK, 0 rows affected, 4 warnings (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

root@localhost : test 03:34:05>show warnings;
+---------+------+---------------------------------------------------------+
| Level   | Code | Message                                                 |
+---------+------+---------------------------------------------------------+
| Warning | 1071 | Specified key was too long; max key length is 767 bytes |
| Warning | 1071 | Specified key was too long; max key length is 767 bytes |
| Warning | 1071 | Specified key was too long; max key length is 767 bytes |
| Warning | 1071 | Specified key was too long; max key length is 767 bytes |
+---------+------+---------------------------------------------------------+
4 rows in set (0.00 sec)
root@localhost : test 03:53:40>alter table tb add index idx_all_5(a,b,c,d,e);
ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes

root@localhost : test 03:54:22>show create table tb\G;
*************************** 1. row ***************************
       Table: tb
Create Table: CREATE TABLE `tb` (
  `a` varchar(256) DEFAULT NULL,
  `b` varchar(2556) DEFAULT NULL,
  `c` varchar(256) DEFAULT NULL,
  `d` varchar(256) DEFAULT NULL,
  `e` varchar(256) DEFAULT NULL,
  KEY `idx_all` (`a`(255),`b`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

 11,在show processlist顯示的狀態裏面:update表示正在insert ,updating表示正在delete,Updating纔是表示正在update。

複製代碼
+-----+------+-----------+------+---------+------+----------------+----------------+
| Id  | User | Host      | db   | Command | Time | State          | Info           |
+-----+------+-----------+------+---------+------+----------------+----------------+
| 322 | root | localhost | test | Query   |    1 | updating       | delete from ...|
| 322 | root | localhost | test | Query   |   18 | Updating       | update      ...|
| 322 | root | localhost | test | Query   |   49 | update         | insert into ...|
+-----+------+-----------+------+---------+------+----------------+----------------+
複製代碼

 12,清除Slave信息:在5.5之後新增了一個命令:reset slave all,可以清除Slave的所有信息。

View Code
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.200.25
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysqld-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: 
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 0
              Relay_Log_Space: 126
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql> reset slave all;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
Empty set (0.00 sec)

 13,字段類型timestamp在5.6之前,一個表不能定義2個以上的包含(1,default current_timestamp;2,on update current_timestamp)的表定義,否則建表出錯。原因見:這裏

View Code
5.6 之前版本:
#不能定義2個列包含 default current_timestampon update current_timestamp 屬性的字段:
root@localhost : test 09:29:27>CREATE TABLE `tran1` (
    ->   `id` int(11) NOT NULL DEFAULT '0',
    ->   `name` varchar(10) DEFAULT NULL,
    ->   `ctime` timestamp default current_timestamp,
    ->   `mtime` timestamp on update current_timestamp,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

#能定義同一個列包含 default current_timestampon update current_timestamp 屬性的字段:
root@localhost : test 09:29:47>CREATE TABLE `tran1` (
    ->   `id` int(11) NOT NULL DEFAULT '0',
    ->   `name` varchar(10) DEFAULT NULL,
    ->   `ctime` timestamp default current_timestamp  on update current_timestamp,
    ->   `mtime` timestamp,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.27 sec)

5.6版本之後:
#沒有這個限制:
root@192.168.220.200 : test 09:30:03>CREATE TABLE `tran1` (
    ->   `id` int(11) NOT NULL DEFAULT '0',
    ->   `name` varchar(10) DEFAULT NULL,
    ->   `ctime` timestamp default current_timestamp,
    ->   `mtime` timestamp on update current_timestamp,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.20 sec)

 14,mysql -e "command" 生成結果導入指定文件時,若要同時顯示語句本身,-v; 若要增加查詢結果行數,加-vv; 若要增加執行時間, 加-vvv。

mysql -e "select user,host from mysql.user" -v/-vv/-vvv > 1.txt

 15,myisamchk使用注意事項:當一張MYISAM表壞了,索引文件大於sort_buffer_size,要是用myisamchk去修復,會報錯,需要手動指定--sort_buffer_size。大小最好設置大於MYI文件的大小。

View Code
root@zjy:/data/mysql2/mstem# myisamchk -r -q edail_log.MYI
- recovering (with sort) MyISAM-table ' edail_log.MYI'
Data records: 0
- Fixing index 1
- Fixing index 2
myisamchk: error: myisam_sort_buffer_size is too small
MyISAM-table ' edail_log.MYI' is not fixed because of errors
Try fixing it by using the --safe-recover (-o), the --force (-f) option or by not using the --quick (-q) flag

root@zjy:/data/mysql2/mstem# myisamchk -r -q  --sort_buffer_size=2024M  edail_log.MYI 
- check record delete-chain
- recovering (with sort) MyISAM-table ' edail_log.MYI'
Data records: 0
- Fixing index 1
- Fixing index 2
- Fixing index 3
Data records: 68464254

16,字符集:utf8mb4:mysql 5.5.3之後出來的字符集,佔用1~4個字節,最大佔用的字節數爲4。目前這個字段主要應用在(Emoji 表情需要4個字節)讓Mysql支持Emoji表情 ,utf8mb4兼容utf8(1~3字節),且比utf8能表示更多的字符。什麼時候需要才用utf8mb4,否則只是浪費空間(比如utf8佔用3個字節,10個漢字佔用30個字節。這時候改成utf8mb4也只有30個,物理上佔用的空間一樣,但是在申請內存的時候,utf8mb4會多於utf8 1個字節)。對於一個BMP字符(<=3字節),utf8和utf8mb4的有相同的存儲特性:相同的代碼值,相同長度,相同的編碼;但utf8mb4範圍更大。
       適用範圍:存類似emoji 這種類型的數據,是因爲utf8滿足不了,才用utf8mb4的。能用utf8的都能用utf8mb4,而且佔用的也只是3個字節。對於哪些需要4個字節的,這個就用到了utf8mb4自己的特點。要是不在乎空間浪費的話,utf8mb4可以全部替換掉utf8,擔心的話,則按照需要分配字符集(表,字段)。

17,
修復Innodb表的時候需要注意:innodb_purge_threads 和 innodb_force_recovery一起設置的時候需要注意:innodb_purge_threads=1時,innodb_force_recovery不能大於1(可以等於1);當innodb_purge_threads=0時,innodb_force_recovery沒有限制。

18,數據庫中的加鎖協議,分爲樂觀/悲觀兩類:樂觀加鎖,操作記錄時不主動加鎖,由後續衝突者負責加鎖;悲觀加鎖,操作記錄時主動加鎖。樂觀加鎖適用於併發衝突較小時,減少了加鎖開銷;而悲觀加鎖適用於併發衝突較大時,簡化操作流程。以InnoDB爲例,Update採用了悲觀加鎖協議,Insert則採用了樂觀加鎖。來自這裏

 19,Engine=innodb,當table.frm文件丟失時,drop database會出現兩種情況: 1)version=5.1,報ERROR 1010 (HY000): Error dropping database (can't rmdir './D1', errno: 39) ;2)version=5.5,正常執行。根源在innobase_drop_database函數的調用順序的不同。而engine=MyISAM 時,5.1,5.5都報39錯誤。

20,爲什麼正則表達式中/d比[0-9]效率差? /d匹配的是Unicode,所以相當於要篩選各種語言裏的數字字符,而[0-9]只匹配這是個數字。

21,5.6之前add foreign key 還是不能使用fast-index-creation. 5.6之後支持,但需要在執行加外鍵之前先 set foreign_key_checks=0

22,STATEMENT下5.1到5.5複製的注意事項:5.1 無符號的整數類型,如果相減得到負數,mysql會自動轉化爲最大的正數;5.5直接報錯。

5.1:
root@localhost : test 10:24:30>select cast(0 as unsigned)-1;
+-----------------------+
| cast(0 as unsigned)-1 |
+-----------------------+
|  18446744073709551615 |
+-----------------------+
1 row in set (0.00 sec)

5.5:
zjy@192.168.200.233 : (none) 10:25:04>select cast(0 as unsigned)-1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
View Code

 23,MySQL創建PK一定是copy table的方式,是因爲整個過程都持有metadata lock的排他鎖。當設置old_alter_table=1,所有的DDL都必須copy table,copy table的過程中只持有MDL的共享鎖,就不會阻塞讀了。詳情見:這裏這裏;另外,在5.6版本之前,old_alter_table 還有另一個用處:就是對錶有重複數據的字段添加唯一索引的時候報錯,則可以設置爲1,詳情見:這裏 這裏,但出現的問題是:設置old_alter_table=ON,會繞過innodb_plugin的alter table快速建索引不拷貝表的優化,會出現copy tmp table。

 24,mysqladmin的察看qps:

mysqladmin --no-defaults ext -i1  -uzjy -p -h192.168.200.2 | awk '/Queries/{q=$4-qp;qp=$4} /Threads_connected/{tc=$4} /Threads_running/{printf "%5d %5d %5d\n",q,tc,$4}'
第一列:每秒查詢量   
第二列:鏈接數
第三列:當前執行的鏈接數

1503   100     2
  576   100     2
  964   100     3
 1288   100     2
  582   100     2
 1064   100     2
  971   100     3
  438   100     2
  290   100     2
 1452   100     2
View Code

25,limit 提前終止。limit N是取前N條記錄;有2種情況,1:要排序,需要把所有的結果取出來排序,再取前N條,不會提前終止。2:不排序,全表隨機掃描記錄,只需要掃描取出前N條記錄就終止了,不會繼續掃描。相比之下,2比1要快很多,因爲掃描的行數少很多。

26,關於死鎖:在防止死鎖(deadlock)方面,表鎖比行鎖更有優勢。使用表鎖的時候,死鎖不會發生,因爲服務器可以通過查看語句來檢測需要的數據表,並提前鎖定它們。而InnoDB會發生死鎖,因爲存儲引擎沒有在事務開始的時候分配所有鎖,而是在事務處理的過程中,當檢測到需要鎖的時候才分配。這就可能出現兩個語句獲取了鎖,接着試圖進一步獲取鎖(需要多個鎖),但是這些鎖卻被對方保持着,等待對方釋放。其結果是每個客戶端都擁有一個鎖,同時還需要利用其它的客戶端擁有的鎖才能繼續執行。這會導致死鎖,服務器必須終止其中一個事務。

27,Range掃描對於範圍條件查詢【range】,MySQL無法使用範圍列後面的其他索引列了【>,<】,而對於多個等值條件查詢可以用【in】,但對Order By、Group By也不能。記住以下這些情況:

索引:(customCate,creator)
1:
explain select * from tb where customCate in ('4028487718bc5d980118bd277fc40000','402848771a0449fc011a044afca60001','402848771a0449fc011a05672a260655','402848771a05fb0e011a0a50401b058f') and creator ='4028487718bc5d980118bd277fc40069';
+----+-------------+-------------+-------+------------------------------------------+------------------------+---------+------+-------+-------------+
| id | select_type | table       | type  | possible_keys                            | key                    | key_len | ref  | rows  | Extra       |
+----+-------------+-------------+-------+------------------------------------------+------------------------+---------+------+-------+-------------+
|  1 | SIMPLE      | tb          | range | idx_customCate_creator,idx_creator_releD | idx_customCate_creator | 198     | NULL | 16371 | Using where |
+----+-------------+-------------+-------+------------------------------------------+------------------------+---------+------+-------+-------------+

執行計劃裏的Type爲range,但是in屬於多個等值條件,可以繼續用第2個索引,和>,<情況不一樣。

2:
explain select * from tb where customCate in  ('402848771a05fb0e011a0a50401b058f','402848771a05fb0e011a0a506eab0590','402848771a05fb0e011a0a50c90f0592') order by creator;
+----+-------------+-------------+-------+------------------------+------------------------+---------+------+-------+-----------------------------+
| id | select_type | table       | type  | possible_keys          | key                    | key_len | ref  | rows  | Extra                       |
+----+-------------+-------------+-------+------------------------+------------------------+---------+------+-------+-----------------------------+
|  1 | SIMPLE      | tb          | range | idx_customCate_creator | idx_customCate_creator | 99      | NULL | 19869 | Using where; Using filesort |
+----+-------------+-------------+-------+------------------------+------------------------+---------+------+-------+-----------------------------+

對於Order ByGroup By 第2個索引不能用,和>,< 情況一樣。

3:
explain select * from tb 
where 
    customCate in ('402848771a05fb0e011a0a50401b058f','402848771a05fb0e011a0a506eab0590','402848771a05fb0e011a0a50c90f0592') 
and 
    creator in ('4028487718bc5d980118bd277fc40069','4028487718dbd37a0118e54b53e300e8','4028487718dbd37a0118e54b53e300e8');
+----+-------------+-------------+-------+------------------------------------------+------------------------+---------+------+-------+-------------+
| id | select_type | table       | type  | possible_keys                            | key                    | key_len | ref  | rows  | Extra       |
+----+-------------+-------------+-------+------------------------------------------+------------------------+---------+------+-------+-------------+
|  1 | SIMPLE      | tb          | range | idx_customCate_creator,idx_creator_releD | idx_customCate_creator | 198     | NULL | 19881 | Using where |
+----+-------------+-------------+-------+------------------------------------------+------------------------+---------+------+-------+-------------+
1 row in set (0.00 sec)

可以在多個字段一起用多個等值條件查詢,多個字段的索引都可以被利用,和>,<情況不一樣。

4:IN 用法不適用於 NOT IN 

explain select * from tb where customCate  not in ('4028487718bc5d980118bd277fc40000','402848771a05fb0e011a0a506eab0590','402848771a05fb0e011a0a50c90f0592') and creator ='4028487718bc5d980118bd277fc40069';
+----+-------------+-------------+------+------------------------------------------+-------------------+---------+-------+-------+-------------+
| id | select_type | table       | type | possible_keys                            | key               | key_len | ref   | rows  | Extra       |
+----+-------------+-------------+------+------------------------------------------+-------------------+---------+-------+-------+-------------+
|  1 | SIMPLE      | tb          | ref  | idx_customCate_creator,idx_creator_releD | idx_creator_releD | 99      | const | 42008 | Using where |
+----+-------------+-------------+------+------------------------------------------+-------------------+---------+-------+-------+-------------+
View Code

 

 

~~~~~~~~~~~~~~~ 若有所失,若有所思 ~~~~~~~~~~~~~~~
發佈了5 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章