sql优化的8种⽅式
1.设置索引。
MySQL索引操作:
给表列创建索引:
建表时创建索引:
create table t(id int,name varchar(20),index idx_name (name));
给表追加索引:
alter table t add unique index idx_id(id);
给表的多列上追加索引
alter table t add index idx_id_name(id,name);
或者:
create index idx_id_name on t(id,name);
查看索引
使⽤show语句查看t表上的索引:
show index from t;
或者:
show keys from t;–mysql中索引也被称作keys
使⽤show create table语句查看索引:
show create table t\G
删除索引:
使⽤alter table命令删除索引:
alter table 表 drop index 索引名
使⽤drop index命令删除索引:
drop index 索引名 on 表
索引原理:
例如⼀个学⽣信息表,我们设置学号(stu_id)为索引:
索引页之间存在⼀定的关联关系,⼀般为树形结构;分为根节点、分⽀节点、和叶⼦节点
根节点页中存放分段stu_id的起始值,以及值所对应的分⽀索引页号
分⽀索引页中存放分段stu_id的起始值,以及值所对应的叶⼦索引页号
叶⼦索引页中存放排序后的stu_id值,该值所对应的表页号, 下⼀个叶⼦索引页的页号.
2.使⽤EXPLAIN 来查看你的 SELECT 查询
关于MySQL服务器是如何执⾏SQL语句的相关信息可以⽤explain语句来查看,可以⽤explain语句查看执⾏过
程的语句主要有select、insert、update、delete等,其使⽤⽅式是explain后接具体的增删改查SQL语句。
例如:explain select * from test.t; 其返回形式为数据表,如下图所⽰:
其中每个字段代表的含义如下:
三、不要使⽤表达式作为查询条件
使⽤采⽤表达式的⽅式作为查询条件,条件列中的索引会失效,即便返回⾏数⾮常少,优化器也会使⽤低效的
全表扫⽅式来解析SQL语句;如果同样效果的语句采⽤⽅式⼆的写法,索引不会失效,查询效率⾼。
查看mysql索引发⽣这种事情的深层原因在于:
⼤多数的MySQL服务器都开启了查询缓存。这是提⾼性最有效的⽅法之⼀,⽽且这是被MySQL的数据库引擎处
理的。当有很多相同的查询被执⾏了多次的时候,这些查询结果会被放到⼀个缓存中,这样,后续的相
同的查询就不⽤操作表⽽直接访问缓存结果了。但是当使⽤表达式的时候,就会不使⽤缓存,因为这些函数的返回是会不定的易变的
四、尽量使⽤in运⾏符来替代or运算
⽐较以下两种SQL语句书写⽅式,⽐较运⾏时间:
⽅式⼀:select * from t where id=1 or id=2 or id=3;
⽅式⼆:select * from t where id in (1,2,3);
由于t表id列已添加索引,可以使⽤MySQL⾃带压⼒测试⼯具mysqlslap,增加并发⽤户数量和查询次数⽐较两种⽅式的运⾏效率。
mysqlslap命令常⽤选项如下所⽰:
-u:连接数据库⽤户名
-p:链接数据库密码
-concurrency:并发谅解客户端数量
-query:运⾏的测试SQL语句
-create-schema:测试SQL语句所在数据库
-number-of-queries:所有链接客户端运⾏测试SQL语句的次数
-itreations:本次测试的重复执⾏次数
将⽅式⼀和⽅式⼆的SQL语句,使⽤mysqlslap进⾏测试,采⽤100个并发客户端,所有客户端⼀共运⾏5000次,可以写成以下⽅式:
⽅式⼀:
mysqlslap -uroot -p --create-schrma=test --query=‘select * from t where id=1 or id=2 or id=3’ --concurrency=100 --number-of-queries=5000
⽅式⼆:
mysqlslap -uroot -p --create-schema=test --query=‘select * from t where id in (1,2,3)’ --concurrency=100 --number-of-queries=5000
测试结果如下:
从实验结果可以看出,SQL语句采⽤⽅式⼀的or⽅式50个并发⽤户执⾏5000次查询所⽤的时间为1.09秒;SQL 语句采⽤⽅式⼆的in⽅式50个并发⽤户执⾏5000次查询所⽤的时间为0.93秒,在写法等效的情况下,使⽤IN来替代OR效率更⾼。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论