Oldguo-標(biāo)桿班級(jí)-MySQL-lesson04-索引及執(zhí)行計(jì)劃

如果您對(duì)數(shù)據(jù)庫(kù)感興趣,可以添加 DBA解決方案QQ群:895979329

1. 索引作用

提供了類似于書(shū)中目錄的作用,目的是為了優(yōu)化查詢

2. 索引的種類(算法)

B樹(shù)索引
Hash索引
R樹(shù)
Full text
GIS 

3. B樹(shù) 基于不同的查找算法分類介紹

image.png
B-tree
B+Tree 在范圍查詢方面提供了更好的性能(> < >= <= like)
B*Tree

4. 在功能上的分類

4.1 輔助索引(S)怎么構(gòu)建B樹(shù)結(jié)構(gòu)的?

(1). 索引是基于表中,列(索引鍵)的值生成的B樹(shù)結(jié)構(gòu)
(2). 首先提取此列所有的值,進(jìn)行自動(dòng)排序
(3). 將排好序的值,均勻的分布到索引樹(shù)的葉子節(jié)點(diǎn)中(16K)
(4). 然后生成此索引鍵值所對(duì)應(yīng)得后端數(shù)據(jù)頁(yè)的指針
(5). 生成枝節(jié)點(diǎn)和根節(jié)點(diǎn),根據(jù)數(shù)據(jù)量級(jí)和索引鍵長(zhǎng)度,生成合適的索引樹(shù)高度
id  name  age  gender
select  *  from  t1 where id=10;
問(wèn)題: 基于索引鍵做where查詢,對(duì)于id列是順序IO,但是對(duì)于其他列的查詢,可能是隨機(jī)IO.

4.2 聚集索引(C)

4.2.1 前提

(1)表中設(shè)置了主鍵,主鍵列就會(huì)自動(dòng)被作為聚集索引.
(2)如果沒(méi)有主鍵,會(huì)選擇唯一鍵作為聚集索引.
(3)聚集索引必須在建表時(shí)才有意義,一般是表的無(wú)關(guān)列(ID)

4.2.2 輔助索引(S)怎么構(gòu)建B樹(shù)結(jié)構(gòu)的?

(1) 在建表時(shí),設(shè)置了主鍵列(ID)
(2) 在將來(lái)錄入數(shù)據(jù)時(shí),就會(huì)按照ID列的順序存儲(chǔ)到磁盤(pán)上.(我們又稱之為聚集索引組織表)
(3) 將排好序的整行數(shù)據(jù),生成葉子節(jié)點(diǎn).可以理解為,磁盤(pán)的數(shù)據(jù)頁(yè)就是葉子節(jié)點(diǎn)

4.2.3 聚集索引和輔助索引構(gòu)成區(qū)別

聚集索引只能有一個(gè),非空唯一,一般時(shí)主鍵
輔助索引,可以有多個(gè),時(shí)配合聚集索引使用的
聚集索引葉子節(jié)點(diǎn),就是磁盤(pán)的數(shù)據(jù)行存儲(chǔ)的數(shù)據(jù)頁(yè)
MySQL是根據(jù)聚集索引,組織存儲(chǔ)數(shù)據(jù),數(shù)據(jù)存儲(chǔ)時(shí)就是按照聚集索引的順序進(jìn)行存儲(chǔ)數(shù)據(jù)
輔助索引,只會(huì)提取索引鍵值,進(jìn)行自動(dòng)排序生成B樹(shù)結(jié)構(gòu)
image.png

5.輔助索引細(xì)分

1.普通的單列輔助索引
2.聯(lián)合索引
多個(gè)列作為索引條件,生成索引樹(shù),理論上設(shè)計(jì)的好的,可以減少大量的回表
查詢
3.唯一索引
索引列的值都是唯一的.

6. 關(guān)于索引樹(shù)的高度受什么影響

1. 數(shù)據(jù)量級(jí), 解決方法:分表,分庫(kù),分布式
2. 索引列值過(guò)長(zhǎng) , 解決方法:前綴索引
3. 數(shù)據(jù)類型:
變長(zhǎng)長(zhǎng)度字符串,使用了char,解決方案:變長(zhǎng)字符串使用varchar
enum類型的使用enum ('山東','河北','黑龍江','吉林','遼寧','陜西'......)
                                         1      2      3

7. 索引的基本管理

7.1 索引建立前

db01 [world]>desc city;
+-------------+----------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO  | PRI | NULL    | auto_increment |
| Name        | char(35) | NO  |    |        |                |
| CountryCode | char(3)  | NO  | MUL |        |                |
| District    | char(20) | NO  |    |        |                |
| Population  | int(11)  | NO  |    | 0      |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

Field :列名字
key  :有沒(méi)有索引,索引類型
PRI: 主鍵索引
UNI: 唯一索引
MUL: 輔助索引(單列,聯(lián)和,前綴)

7.1 單列普通輔助索引

7.1.1 創(chuàng)建索引

db01 [world]>alter table city add index idx_name(name);
                                       表                    索引名(列名)
db01 [world]>create index idx_name1 on city(name);
db01 [world]>show index from city;
![image](https://upload-images.jianshu.io/upload_images/16956686-8c8421524dca6291.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
注意:
以上操作不代表生產(chǎn)操作,我們不建議在一個(gè)列上建多個(gè)索引
同一個(gè)表中,索引名不能同名。
### 7.1.2 刪除索引:
db01 [world]>alter table city drop index idx_name1;
                                        表名                 索引名

7.2 覆蓋索引(聯(lián)合索引)

Master [world]>alter table city add index idx_co_po(countrycode,population);

7.3 前綴索引

db01 [world]>alter table city add index idx_di(district(5));
注意:數(shù)字列不能用作前綴索引。

7.4 唯一索引

db01 [world]>alter table city add unique index idx_uni1(name);
ERROR 1062 (23000): Duplicate entry 'San Jose' for key 'idx_uni1'

統(tǒng)計(jì)city表中,以省的名字為分組,統(tǒng)計(jì)組的個(gè)數(shù)

select district,count(id) from city group by district;
需求: 找到world下,city表中 name列有重復(fù)值的行,最后刪掉重復(fù)的行
db01 [world]>select name,count(id) as cid from city group by name  having cid>1 order by cid desc;
db01 [world]>select * from city where name='suzhou';

===============================================

8. 執(zhí)行計(jì)劃獲取及分析

8.0 介紹

(1)
獲取到的是優(yōu)化器選擇完成的,他認(rèn)為代價(jià)最小的執(zhí)行計(jì)劃.
作用: 語(yǔ)句執(zhí)行前,先看執(zhí)行計(jì)劃信息,可以有效的防止性能較差的語(yǔ)句帶來(lái)的性能問(wèn)題.
如果業(yè)務(wù)中出現(xiàn)了慢語(yǔ)句,我們也需要借助此命令進(jìn)行語(yǔ)句的評(píng)估,分析優(yōu)化方案。
(2) select 獲取數(shù)據(jù)的方法
1. 全表掃描(應(yīng)當(dāng)盡量避免,因?yàn)樾阅艿?
2. 索引掃描
3. 獲取不到數(shù)據(jù)

8.1 執(zhí)行計(jì)劃獲取

獲取優(yōu)化器選擇后的執(zhí)行計(jì)劃


image

image

8.2 執(zhí)行計(jì)劃分析

8.2.0 重點(diǎn)關(guān)注的信息

table: city                              ---->查詢操作的表    **
possible_keys: CountryCode,idx_co_po      ---->可能會(huì)走的索引  **
key: CountryCode   ---->真正走的索引    ***
type: ref   ---->索引類型        *****
Extra: Using index condition              ---->額外信息        *****

8.2.1 type詳解

從左到右性能依次變好.
ALL  :  
全表掃描,不走索引
例子:
1. 查詢條件列,沒(méi)有索引
SELECT * FROM t_100w WHERE k2='780P';  
2. 查詢條件出現(xiàn)以下語(yǔ)句(輔助索引列)
USE world 
DESC city;
DESC SELECT * FROM city WHERE countrycode <> 'CHN';
DESC SELECT * FROM city WHERE countrycode NOT IN ('CHN','USA');
DESC SELECT * FROM city WHERE countrycode LIKE '%CH%';
注意:對(duì)于聚集索引列,使用以上語(yǔ)句,依然會(huì)走索引
DESC SELECT * FROM city WHERE id <> 10;

INDEX  :
全索引掃描
1. 查詢需要獲取整個(gè)索引樹(shù)種的值時(shí):
DESC  SELECT countrycode  FROM city;

2. 聯(lián)合索引中,任何一個(gè)非最左列作為查詢條件時(shí):
idx_a_b_c(a,b,c)  ---> a  ab  abc

SELECT * FROM t1 WHERE b 
SELECT * FROM t1 WHERE c    

RANGE :
索引范圍掃描 
輔助索引> < >= <= LIKE IN OR 
主鍵 <>  NOT IN

例子:
1. 
DESC SELECT * FROM city WHERE id<5;
2. 
DESC SELECT * FROM city WHERE countrycode LIKE 'CH%';
3. 
DESC SELECT * FROM city WHERE countrycode IN ('CHN','USA');

注意: 
1和2例子中,可以享受到B+樹(shù)的優(yōu)勢(shì),但是3例子中是不能享受的.
所以,我們可以將3號(hào)列子改寫(xiě):

DESC SELECT * FROM city WHERE countrycode='CHN'
UNION ALL 
SELECT * FROM city WHERE countrycode='USA';
ref: 
非唯一性索引,等值查詢
DESC SELECT * FROM city WHERE countrycode='CHN';
eq_ref: 
在多表連接時(shí),連接條件使用了唯一索引(uk  pK)

DESC SELECT b.name,a.name FROM city AS a 
JOIN country AS b 
ON a.countrycode=b.code 
WHERE a.population <100;
DESC country
system,const :
唯一索引的等值查詢
DESC SELECT * FROM city WHERE id=10;

8.2.2 其他字段解釋

extra: 
filesort ,文件排序.
SHOW INDEX FROM city;
ALTER TABLE city ADD INDEX CountryCode(CountryCode);
ALTER TABLE city DROP INDEX idx_c_p;

DESC SELECT * FROM city WHERE countrycode='CHN'  ORDER BY population 

ALTER TABLE city ADD INDEX idx_(population);
DESC SELECT * FROM city WHERE countrycode='CHN'  ORDER BY population 
ALTER TABLE city ADD INDEX idx_c_p(countrycode,population);
ALTER TABLE city DROP INDEX idx_;
ALTER TABLE city DROP INDEX CountryCode;
DESC SELECT * FROM city WHERE countrycode='CHN'  ORDER BY population 

結(jié)論: 
1.當(dāng)我們看到執(zhí)行計(jì)劃extra位置出現(xiàn)filesort,說(shuō)明由文件排序出現(xiàn)
2.觀察需要排序(ORDER BY,GROUP BY ,DISTINCT )的條件,有沒(méi)有索引
3. 根據(jù)子句的執(zhí)行順序,去創(chuàng)建聯(lián)合索引

索引優(yōu)化效果測(cè)試:
優(yōu)化前:
[root@db01 ~]# mysqlslap --defaults-file=/etc/my.cnf \
> --concurrency=100 --iterations=1 --create-schema='oldboy' \
> --query="select * from oldboy.t_100w where k2='780P'" engine=innodb \
> --number-of-queries=2000 -uroot -p123 -verbose
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
    Running for engine rbose
    Average number of seconds to run all queries: 701.743 seconds
    Minimum number of seconds to run all queries: 701.743 seconds
    Maximum number of seconds to run all queries: 701.743 seconds
    Number of clients running queries: 100
    Average number of queries per client: 20

優(yōu)化后:
[root@db01 ~]# mysqlslap --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 --create-schema='oldboy' --query="select * from oldboy.t_100w where k2='780P'" engine=innodb --number-of-queries=2000 -uroot -p123 -verbose
mysqlslap: [Warning] Using a password on the command line interface can be insecure.
Benchmark
    Running for engine rbose
    Average number of seconds to run all queries: 0.190 seconds
    Minimum number of seconds to run all queries: 0.190 seconds
    Maximum number of seconds to run all queries: 0.190 seconds
    Number of clients running queries: 100
    Average number of queries per client: 20

聯(lián)合索引:
1. SELECT * FROM t1  WHERE a=    b=   
我們建立聯(lián)合索引時(shí):
ALTER TABLE t1 ADD INDEX idx_a_b(a,b);  
ALTER TABLE t1 ADD INDEX idx_b_a(b,a);  
以上的查詢不考慮索引的順序,優(yōu)化器會(huì)自動(dòng)調(diào)整where的條件順序
注意: 索引,我們?cè)谶@種情況下建索引時(shí),需要考慮哪個(gè)列的唯一值更多,哪個(gè)放在索引左邊.

2.  如果出現(xiàn)where 條件中出現(xiàn)不等值查詢條件
DESC  SELECT * FROM t_100w WHERE num <1000 AND k2='DEEF';
我們建索引時(shí):
ALTER TABLE t_100w ADD INDEX idx_2_n(k2,num);
語(yǔ)句書(shū)寫(xiě)時(shí)
DESC  SELECT * FROM t_100w WHERE  k2='DEEF'  AND  num <1000 ;
3. 如果查詢中出現(xiàn)多子句
我們要按照子句的執(zhí)行順序進(jìn)行建立索引.

8.2.3 explain(desc)使用場(chǎng)景(面試題)

題目意思:  我們公司業(yè)務(wù)慢,請(qǐng)你從數(shù)據(jù)庫(kù)的角度分析原因
1.mysql出現(xiàn)性能問(wèn)題,我總結(jié)有兩種情況:
(1)應(yīng)急性的慢:突然夯住
應(yīng)急情況:數(shù)據(jù)庫(kù)hang(卡了,資源耗盡)
處理過(guò)程:
1.show processlist;  獲取到導(dǎo)致數(shù)據(jù)庫(kù)hang的語(yǔ)句
2. explain 分析SQL的執(zhí)行計(jì)劃,有沒(méi)有走索引,索引的類型情況
3. 建索引,改語(yǔ)句
(2)一段時(shí)間慢(持續(xù)性的):
(1)記錄慢日志slowlog,分析slowlog
(2)explain 分析SQL的執(zhí)行計(jì)劃,有沒(méi)有走索引,索引的類型情況
(3)建索引,改語(yǔ)句

9. 索引應(yīng)用規(guī)范

業(yè)務(wù)
1.產(chǎn)品的功能
2.用戶的行為
"熱"查詢語(yǔ)句 --->較慢--->slowlog
"熱"數(shù)據(jù)

9.1 建立索引的原則(DBA運(yùn)維規(guī)范)

9.1.0 說(shuō)明

為了使索引的使用效率更高,在創(chuàng)建索引時(shí),必須考慮在哪些字段上創(chuàng)建索引和創(chuàng)建什么類型的索引。那么索引設(shè)計(jì)原則又是怎樣的?

9.1.1 (必須的) 建表時(shí)一定要有主鍵,一般是個(gè)無(wú)關(guān)列

略.回顧一下,聚集索引結(jié)構(gòu).

9.1.2 選擇唯一性索引

唯一性索引的值是唯一的,可以更快速的通過(guò)該索引來(lái)確定某條記錄。
例如,學(xué)生表中學(xué)號(hào)是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個(gè)學(xué)生的信息。
如果使用姓名的話,可能存在同名現(xiàn)象,從而降低查詢速度。

優(yōu)化方案:
(1) 如果非得使用重復(fù)值較多的列作為查詢條件(例如:男女),可以將表邏輯拆分
(2) 可以將此列和其他的查詢類,做聯(lián)和索引
select count(*) from world.city;
select count(distinct countrycode) from world.city;
select count(distinct countrycode,population ) from world.city;

9.1.3(必須的) 為經(jīng)常需要where 、ORDER BY、GROUP BY,join on等操作的字段,

排序操作會(huì)浪費(fèi)很多時(shí)間。
where  A B C      ----》 A  B  C
in 
where A   group by B  order by C
A,B,C

如果為其建立索引,優(yōu)化查詢
注:如果經(jīng)常作為條件的列,重復(fù)值特別多,可以建立聯(lián)合索引。

9.1.4 盡量使用前綴來(lái)索引

如果索引字段的值很長(zhǎng),最好使用值的前綴來(lái)索引。

9.1.5 限制索引的數(shù)目

索引的數(shù)目不是越多越好。
可能會(huì)產(chǎn)生的問(wèn)題:
(1) 每個(gè)索引都需要占用磁盤(pán)空間,索引越多,需要的磁盤(pán)空間就越大。
(2) 修改表時(shí),對(duì)索引的重構(gòu)和更新很麻煩。越多的索引,會(huì)使更新表變得很浪費(fèi)時(shí)間。
(3) 優(yōu)化器的負(fù)擔(dān)會(huì)很重,有可能會(huì)影響到優(yōu)化器的選擇.
percona-toolkit中有個(gè)工具,專門(mén)分析索引是否有用

9.1.6 刪除不再使用或者很少使用的索引(percona toolkit)

pt-duplicate-key-checker

表中的數(shù)據(jù)被大量更新,或者數(shù)據(jù)的使用方式被改變后,原有的一些索引可能不再需要。數(shù)據(jù)庫(kù)管理
員應(yīng)當(dāng)定期找出這些索引,將它們刪除,從而減少索引對(duì)更新操作的影響。

9.1.7 大表加索引,要在業(yè)務(wù)不繁忙期間操作

9.1.8 盡量少在經(jīng)常更新值的列上建索引

9.1.9 建索引原則

(1) 必須要有主鍵,如果沒(méi)有可以做為主鍵條件的列,創(chuàng)建無(wú)關(guān)列
(2) 經(jīng)常做為where條件列  order by  group by  join on, distinct 的條件(業(yè)務(wù):產(chǎn)品功能+用戶行為)
(3) 最好使用唯一值多的列作為索引,如果索引列重復(fù)值較多,可以考慮使用聯(lián)合索引
(4) 列值長(zhǎng)度較長(zhǎng)的索引列,我們建議使用前綴索引.
(5) 降低索引條目,一方面不要?jiǎng)?chuàng)建沒(méi)用索引,不常使用的索引清理,percona toolkit(xxxxx)
(6) 索引維護(hù)要避開(kāi)業(yè)務(wù)繁忙期

9.2 不走索引的情況(開(kāi)發(fā)規(guī)范)

9.2.1 沒(méi)有查詢條件,或者查詢條件沒(méi)有建立索引

select * from tab;       全表掃描。
select  * from tab where 1=1;
在業(yè)務(wù)數(shù)據(jù)庫(kù)中,特別是數(shù)據(jù)量比較大的表。
是沒(méi)有全表掃描這種需求。
1、對(duì)用戶查看是非常痛苦的。
2、對(duì)服務(wù)器來(lái)講毀滅性的。
(1)
select * from tab;
SQL改寫(xiě)成以下語(yǔ)句:
select  * from  tab  order by  price  limit 10 ;    需要在price列上建立索引
(2)
select  * from  tab where name='zhangsan'          name列沒(méi)有索引
改:
1、換成有索引的列作為查詢條件
2、將name列建立索引

9.2.2 查詢結(jié)果集是原表中的大部分?jǐn)?shù)據(jù),應(yīng)該是25%以上。

查詢的結(jié)果集,超過(guò)了總數(shù)行數(shù)25%,優(yōu)化器覺(jué)得就沒(méi)有必要走索引了。

假如:tab表 id,name    id:1-100w  ,id列有(輔助)索引
select * from tab  where id>500000;
如果業(yè)務(wù)允許,可以使用limit控制。
怎么改寫(xiě) ?
結(jié)合業(yè)務(wù)判斷,有沒(méi)有更好的方式。如果沒(méi)有更好的改寫(xiě)方案
盡量不要在mysql存放這個(gè)數(shù)據(jù)了。放到redis里面。

9.2.3 索引本身失效,統(tǒng)計(jì)數(shù)據(jù)不真實(shí)

索引有自我維護(hù)的能力。
對(duì)于表內(nèi)容變化比較頻繁的情況下,有可能會(huì)出現(xiàn)索引失效。
一般是刪除重建

現(xiàn)象:
有一條select語(yǔ)句平常查詢時(shí)很快,突然有一天很慢,會(huì)是什么原因
select?  --->索引失效,,統(tǒng)計(jì)數(shù)據(jù)不真實(shí)
DML ?   --->鎖沖突

9.2.4 查詢條件使用函數(shù)在索引列上,或者對(duì)索引列進(jìn)行運(yùn)算,運(yùn)算包括(+,-,*,/,! 等)

例子:
錯(cuò)誤的例子:select * from test where id-1=9;
正確的例子:select * from test where id=10;
算術(shù)運(yùn)算
函數(shù)運(yùn)算
子查詢

9.2.5 隱式轉(zhuǎn)換導(dǎo)致索引失效.這一點(diǎn)應(yīng)當(dāng)引起重視.也是開(kāi)發(fā)中經(jīng)常會(huì)犯的錯(cuò)誤.

這樣會(huì)導(dǎo)致索引失效. 錯(cuò)誤的例子:
mysql> alter table tab add index inx_tel(telnum);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql>
mysql> desc tab;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id    | int(11)    | YES  |    | NULL    |      |
| name  | varchar(20) | YES  |    | NULL    |      |
| telnum | varchar(20) | YES  | MUL | NULL    |      |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> select * from tab where telnum='1333333';
+------+------+---------+
| id  | name | telnum  |
+------+------+---------+
|    1 | a    | 1333333 |
+------+------+---------+
1 row in set (0.00 sec)
mysql> select * from tab where telnum=1333333;
+------+------+---------+
| id  | name | telnum  |
+------+------+---------+
|    1 | a    | 1333333 |
+------+------+---------+
1 row in set (0.00 sec)
mysql> explain  select * from tab where telnum='1333333';
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key    | key_len | ref  | rows | Extra                |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+

|  1 | SIMPLE      | tab  | ref  | inx_tel      | inx_tel | 63      | const |    1 | Using index condition |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
1 row in set (0.00 sec)
mysql> explain  select * from tab where telnum=1333333;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra      |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | tab  | ALL  | inx_tel      | NULL | NULL    | NULL |    2 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
mysql> explain  select * from tab where telnum=1555555;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra      |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | tab  | ALL  | inx_tel      | NULL | NULL    | NULL |    2 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
mysql> explain  select * from tab where telnum='1555555';
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key    | key_len | ref  | rows | Extra                |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
|  1 | SIMPLE      | tab  | ref  | inx_tel      | inx_tel | 63      | const |    1 | Using index condition |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
1 row in set (0.00 sec)
mysql>

9.2.6 <> ,not in 不走索引(輔助索引)

EXPLAIN  SELECT * FROM teltab WHERE telnum  <> '110';
EXPLAIN  SELECT * FROM teltab WHERE telnum  NOT IN ('110','119');

mysql> select * from tab where telnum <> '1555555';
+------+------+---------+
| id  | name | telnum  |
+------+------+---------+
|    1 | a    | 1333333 |
+------+------+---------+
1 row in set (0.00 sec)
mysql> explain select * from tab where telnum <> '1555555';

單獨(dú)的>,<,in 有可能走,也有可能不走,和結(jié)果集有關(guān),盡量結(jié)合業(yè)務(wù)添加limit
or或in  盡量改成union
EXPLAIN  SELECT * FROM teltab WHERE telnum  IN ('110','119');
改寫(xiě)成:
EXPLAIN SELECT * FROM teltab WHERE telnum='110'
UNION ALL
SELECT * FROM teltab WHERE telnum='119'

9.2.7 like "%_" 百分號(hào)在最前面不走

EXPLAIN SELECT * FROM teltab WHERE telnum LIKE '31%'  走range索引掃描
EXPLAIN SELECT * FROM teltab WHERE telnum LIKE '%110'  不走索引
%linux%類的搜索需求,可以使用elasticsearch+mongodb 專門(mén)做搜索服務(wù)的數(shù)據(jù)庫(kù)產(chǎn)品
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容