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的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。但是当使用表达式的时候,就会不使用缓存,因为这些函数的返回是会不定的易变的 - 四、尽量使用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效率更高。
-