( a )ki(i=1..n)为关键字,且关键字按顺序升序排序k(i-1)<ki。 ( b )关键字的个数必须满足:[ceil(m/2)-1]<=n<=m-1]。 ( c )非叶子节点的指针:P[1],P[2]...P[M];其中P[1]指向关键字小于K[1]的子树,P[N]指向关键字大于K[N-1]的子树,其它P[i]指向关键字属于(K[i-1],K[i])的子树。
CREATE DATABASE sqltest;
use sqltest;
create table tb_test(
test_id int primary key auto_increment,
test_name varchar(1024),
test_date datetime,
test_desc varchar(1024)
);
复制代码
在这张表中灌入200w数据。
1.根据慢日志定位慢查询SQL
#查找慢日志
slow_query_log
复制代码
记录慢日志SQL运行时间阈值
设置慢查询阈值为1秒,重连数据库 set global long_query_time = 1;
制造慢查询:
2.使用explain工具分析SQLexplain select test_name from tb_test order by test_name desctype:找到数据的方式,根据效率从高到低排序有如下几种 system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>
index>
all 如果type为index或all,表示本次扫描为全表扫描,说明这个语句是需要优化的。
extra:可以用来辅助type帮助我们进行SQL优化,extra中出现以下两项,意味着MySQL根本不能使用索引,效率会受到重大影响,应该尽可能对此进行优化。 Using filesort:表示MySQL会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容,可能在内存或者磁盘上进行排序。MySQL中无法例用索引完成的排序操作称为“文件排序”。 Using temporary:表示MySQL在对查询结果排序时使用临时表,常见于排序 order by和分组查询group by。 3.修改SQL,尽量让SQL走索引 我们可以知道,创建表时,我们将id设为主键,那么id也就自然称为了索引,所以我们只要修改排序字段为id,即可以通过索引排序。 explain select test_id from tb_test order by test_id desc
#加索引
ALTER TABLE tb_test add index index_name(test_name);
#再次分析
explain select test_name from tb_test order by test_name desc;
复制代码
结果:
联合索引的最左匹配原则的成因
上文中只是用了单一索引对表进行排序,如果使用联合索引又会是什么样的一种状况? 最左匹配原则:假设数据表中有两列,A and B,我们将A、B设置为联合索引,然后在where语句中调用where A = ? AND B = ?,该查询语句会使用AB联合索引,调用where A = ?,该查询语句也会使用AB联合索引,但当调用where B = ?时,它将不会使用AB联合索引。 官方定义:
1.最左前缀匹配原则,MySQL会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如 a=3 and b=4 and c>5 and d=6,如果建立(a,b,c,d)顺序的索引,d是无法使用索引的,如果建立(a,b,d,c)的索引则都可以使用到,a、b、d的顺序可以任意调整。 2.=和in可以乱序,比如 a=1 and b=2 and c=3 建立(a,b,c)索引可以任意顺序,MySQL的查询优化器会帮你优化成索引可以识别的形式。