在前面《关系型数据库MySQL》一文中,我们已经讲到过索引的相关知识,这里我们做一个简单的回顾。
select操作中要查询的列,最适合做索引的列是出现在where子句中经常用作筛选条件或连表子句中作为表连接条件的列。过程,通常也称之为存储过程,它是事先编译好存储在数据库中的一组SQL的集合。调用存储过程可以简化应用程序开发人员的工作,减少与数据库服务器之间的通信,对于提升数据操作的性能是有帮助的,这些我们在之前的《关系型数据库MySQL》一文中已经提到过。
MySQL支持做数据分区,通过分区可以存储更多的数据、优化查询,获得更大的吞吐量并快速删除过期的数据。关于这个知识点建议大家看看MySQL的官方文档。数据分区有以下几种类型:
RANGE分区:基于连续区间范围,把数据分配到不同的分区。
CREATE TABLE tb_emp (
eno INT NOT NULL,
ename VARCHAR(20) NOT NULL,
job VARCHAR(10) NOT NULL,
hiredate DATE NOT NULL,
dno INT NOT NULL
)
PARTITION BY RANGE( YEAR(hiredate) ) (
PARTITION p0 VALUES LESS THAN (1960),
PARTITION p1 VALUES LESS THAN (1970),
PARTITION p2 VALUES LESS THAN (1980),
PARTITION p3 VALUES LESS THAN (1990),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
LIST分区:基于枚举值的范围,把数据分配到不同的分区。
HASH分区 / KEY分区:基于分区个数,把数据分配到不同的分区。
CREATE TABLE tb_emp (
eno INT NOT NULL,
ename VARCHAR(20) NOT NULL,
job VARCHAR(10) NOT NULL,
hiredate DATE NOT NULL,
dno INT NOT NULL
)
PARTITION BY HASH(dno)
PARTITIONS 4;
定位低效率的SQL语句 - 慢查询日志。
查看慢查询日志相关配置
mysql> show variables like 'slow_query%';
+---------------------------+----------------------------------+
| Variable_name | Value |
+---------------------------+----------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /mysql/data/localhost-slow.log |
+---------------------------+----------------------------------+
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
修改全局慢查询日志配置。
mysql> set global slow_query_log='ON';
mysql> set global long_query_time=1;
或者直接修改MySQL配置文件启用慢查询日志。
[mysqld]
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/slow.log
long_query_time=1
通过explain了解SQL的执行计划。例如:
explain select ename, job, sal from tb_emp where dno=20\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tb_emp
type: ref
possible_keys: fk_emp_dno
key: fk_emp_dno
key_len: 5
ref: const
rows: 7
Extra: NULL
1 row in set (0.00 sec)
select_type:查询类型(SIMPLE - 简单查询、PRIMARY - 主查询、UNION - 并集、SUBQUERY - 子查询)。table:输出结果集的表。type:访问类型(ALL - 全表查询性能最差、index、range、ref、eq_ref、const、NULL)。possible_keys:查询时可能用到的索引。key:实际使用的索引。key_len:索引字段的长度。rows:扫描的行数,行数越少肯定性能越好。extra:额外信息。通过show profiles和show profile for query分析SQL。
优化CRUD操作。
insert语句
insert语句后面跟上多组值进行插入在性能上优于分开insert。insert delayed可以获得更好的性能。load data infile比insert性能好得多。order by语句
where子句的条件和order by子句的条件相同,而且排序的顺序与索引的顺序相同,如果还同时满足排序字段都是升序或者降序,那么只靠索引就能完成排序。group by语句
group by子句分组时,如果希望避免排序带来的开销,可以用order by null禁用排序。or关系,则只有在所有条件都用到索引的情况下索引才会生效。可以使用下面的命令来查看MySQL服务器配置参数的默认值。
show variables;
show variables like 'key_%';
show variables like '%cache%';
show variables like 'innodb_buffer_pool_size';
通过下面的命令可以了解MySQL服务器运行状态值。
show status;
show status like 'com_%';
show status like 'innodb_%';
show status like 'connections';
show status like 'slow_queries';
innodb_buffer_pool_size:InnoDB数据和索引的内存缓冲区大小,以字节为单位,这个值设置得越高,访问表数据需要进行的磁盘I/O操作就越少,如果可能甚至可以将该值设置为物理内存大小的80%。