如果您對(duì)數(shù)據(jù)庫(kù)感興趣,可以添加 DBA解決方案QQ群:895979329
1. 索引作用
提供了類似于書中目錄的作用,目的是為了優(yōu)化查詢
2. 索引的種類(算法)
B樹索引
Hash索引
R樹
Full text
GIS
3. B樹 基于不同的查找算法分類介紹
image.png
B-tree
B+Tree 在范圍查詢方面提供了更好的性能(> < >= <= like)
B*Tree
4. 在功能上的分類
4.1 輔助索引(S)怎么構(gòu)建B樹結(jié)構(gòu)的?
(1). 索引是基于表中,列(索引鍵)的值生成的B樹結(jié)構(gòu)
(2). 首先提取此列所有的值,進(jìn)行自動(dòng)排序
(3). 將排好序的值,均勻的分布到索引樹的葉子節(jié)點(diǎn)中(16K)
(4). 然后生成此索引鍵值所對(duì)應(yīng)得后端數(shù)據(jù)頁(yè)的指針
(5). 生成枝節(jié)點(diǎn)和根節(jié)點(diǎn),根據(jù)數(shù)據(jù)量級(jí)和索引鍵長(zhǎng)度,生成合適的索引樹高度
id name age gender
select * from t1 where id=10;
問題: 基于索引鍵做where查詢,對(duì)于id列是順序IO,但是對(duì)于其他列的查詢,可能是隨機(jī)IO.
4.2 聚集索引(C)
4.2.1 前提
(1)表中設(shè)置了主鍵,主鍵列就會(huì)自動(dòng)被作為聚集索引.
(2)如果沒有主鍵,會(huì)選擇唯一鍵作為聚集索引.
(3)聚集索引必須在建表時(shí)才有意義,一般是表的無關(guān)列(ID)
4.2.2 輔助索引(S)怎么構(gòu)建B樹結(jié)構(gòu)的?
(1) 在建表時(shí),設(shè)置了主鍵列(ID)
(2) 在將來錄入數(shù)據(jù)時(shí),就會(huì)按照ID列的順序存儲(chǔ)到磁盤上.(我們又稱之為聚集索引組織表)
(3) 將排好序的整行數(shù)據(jù),生成葉子節(jié)點(diǎn).可以理解為,磁盤的數(shù)據(jù)頁(yè)就是葉子節(jié)點(diǎn)
4.2.3 聚集索引和輔助索引構(gòu)成區(qū)別
聚集索引只能有一個(gè),非空唯一,一般時(shí)主鍵
輔助索引,可以有多個(gè),時(shí)配合聚集索引使用的
聚集索引葉子節(jié)點(diǎ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樹結(jié)構(gòu)
image.png
5.輔助索引細(xì)分
1.普通的單列輔助索引
2.聯(lián)合索引
多個(gè)列作為索引條件,生成索引樹,理論上設(shè)計(jì)的好的,可以減少大量的回表
查詢
3.唯一索引
索引列的值都是唯一的.
6. 關(guān)于索引樹的高度受什么影響
1. 數(shù)據(jù)量級(jí), 解決方法:分表,分庫(kù),分布式
2. 索引列值過長(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 :有沒有索引,索引類型
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ì)劃.
作用: 語句執(zhí)行前,先看執(zhí)行計(jì)劃信息,可以有效的防止性能較差的語句帶來的性能問題.
如果業(yè)務(wù)中出現(xiàn)了慢語句囱皿,我們也需要借助此命令進(jìn)行語句的評(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. 查詢條件列,沒有索引
SELECT * FROM t_100w WHERE k2='780P';
2. 查詢條件出現(xiàn)以下語句(輔助索引列)
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ì)于聚集索引列,使用以上語句,依然會(huì)走索引
DESC SELECT * FROM city WHERE id <> 10;
INDEX :
全索引掃描
1. 查詢需要獲取整個(gè)索引樹種的值時(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+樹的優(yōu)勢(shì),但是3例子中是不能享受的.
所以,我們可以將3號(hào)列子改寫:
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,說明由文件排序出現(xiàn)
2.觀察需要排序(ORDER BY,GROUP BY ,DISTINCT )的條件,有沒有索引
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);
語句書寫時(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)性能問題,我總結(jié)有兩種情況:
(1)應(yīng)急性的慢:突然夯住
應(yīng)急情況:數(shù)據(jù)庫(kù)hang(卡了,資源耗盡)
處理過程:
1.show processlist; 獲取到導(dǎo)致數(shù)據(jù)庫(kù)hang的語句
2. explain 分析SQL的執(zhí)行計(jì)劃,有沒有走索引,索引的類型情況
3. 建索引,改語句
(2)一段時(shí)間慢(持續(xù)性的):
(1)記錄慢日志slowlog,分析slowlog
(2)explain 分析SQL的執(zhí)行計(jì)劃,有沒有走索引,索引的類型情況
(3)建索引,改語句
9. 索引應(yīng)用規(guī)范
業(yè)務(wù)
1.產(chǎn)品的功能
2.用戶的行為
"熱"查詢語句 --->較慢--->slowlog
"熱"數(shù)據(jù)
9.1 建立索引的原則(DBA運(yùn)維規(guī)范)
9.1.0 說明
為了使索引的使用效率更高漓雅,在創(chuàng)建索引時(shí),必須考慮在哪些字段上創(chuàng)建索引和創(chuàng)建什么類型的索引朽色。那么索引設(shè)計(jì)原則又是怎樣的?
9.1.1 (必須的) 建表時(shí)一定要有主鍵,一般是個(gè)無關(guān)列
略.回顧一下,聚集索引結(jié)構(gòu).
9.1.2 選擇唯一性索引
唯一性索引的值是唯一的邻吞,可以更快速的通過該索引來確定某條記錄。
例如葫男,學(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 盡量使用前綴來索引
如果索引字段的值很長(zhǎng)江滨,最好使用值的前綴來索引拥褂。
9.1.5 限制索引的數(shù)目
索引的數(shù)目不是越多越好。
可能會(huì)產(chǎn)生的問題:
(1) 每個(gè)索引都需要占用磁盤空間牙寞,索引越多饺鹃,需要的磁盤空間就越大莫秆。
(2) 修改表時(shí),對(duì)索引的重構(gòu)和更新很麻煩悔详。越多的索引镊屎,會(huì)使更新表變得很浪費(fèi)時(shí)間。
(3) 優(yōu)化器的負(fù)擔(dān)會(huì)很重,有可能會(huì)影響到優(yōu)化器的選擇.
percona-toolkit中有個(gè)工具,專門分析索引是否有用
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) 必須要有主鍵,如果沒有可以做為主鍵條件的列,創(chuàng)建無關(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)建沒用索引,不常使用的索引清理,percona toolkit(xxxxx)
(6) 索引維護(hù)要避開業(yè)務(wù)繁忙期
9.2 不走索引的情況(開發(fā)規(guī)范)
9.2.1 沒有查詢條件拼弃,或者查詢條件沒有建立索引
select * from tab; 全表掃描夏伊。
select * from tab where 1=1;
在業(yè)務(wù)數(shù)據(jù)庫(kù)中,特別是數(shù)據(jù)量比較大的表吻氧。
是沒有全表掃描這種需求溺忧。
1、對(duì)用戶查看是非常痛苦的盯孙。
2鲁森、對(duì)服務(wù)器來講毀滅性的。
(1)
select * from tab;
SQL改寫成以下語句:
select * from tab order by price limit 10 ; 需要在price列上建立索引
(2)
select * from tab where name='zhangsan' name列沒有索引
改:
1振惰、換成有索引的列作為查詢條件
2歌溉、將name列建立索引
9.2.2 查詢結(jié)果集是原表中的大部分?jǐn)?shù)據(jù),應(yīng)該是25%以上骑晶。
查詢的結(jié)果集研底,超過了總數(shù)行數(shù)25%,優(yōu)化器覺得就沒有必要走索引了透罢。
假如:tab表 id榜晦,name id:1-100w ,id列有(輔助)索引
select * from tab where id>500000;
如果業(yè)務(wù)允許羽圃,可以使用limit控制乾胶。
怎么改寫 ?
結(jié)合業(yè)務(wù)判斷朽寞,有沒有更好的方式识窿。如果沒有更好的改寫方案
盡量不要在mysql存放這個(gè)數(shù)據(jù)了。放到redis里面脑融。
9.2.3 索引本身失效喻频,統(tǒng)計(jì)數(shù)據(jù)不真實(shí)
索引有自我維護(hù)的能力。
對(duì)于表內(nèi)容變化比較頻繁的情況下肘迎,有可能會(huì)出現(xiàn)索引失效甥温。
一般是刪除重建
現(xiàn)象:
有一條select語句平常查詢時(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)引起重視.也是開發(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');
改寫成:
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 專門做搜索服務(wù)的數(shù)據(jù)庫(kù)產(chǎn)品