SQL性能优化

tech2025-12-10  2

MySqls数据库的优化是多个方面的,原则是减少系统的瓶颈,减少资源的占用。增加系统的反应速度。例如,通过优化文件系统提高磁盘I/O的读写速度;通过优化操作系统调度策略提高MySql在高负荷情况下的负载能力;优化表结构、索引、查询语句使查询响应更快。

1. 查询mysql数据库的性能参数

> SHOW STATUS LIKE 'VALUE'

其中value是要查询的参数值,一些常用的性能参数如下:

Connections:连接mysql服务器的次数Uptime:MySql服务器上线的时间Slow_queries:慢查询次数Com-select:查询操作的次数Com-insert:插入操作的次数Com-update:更新操作的次数Com-delete:删除操作的次数

2. 利用explain分析查询语句

> EXPLAIN [EXTENDED] SELECT select_options

使用EXTENDED关键字,EXPLAIN语句将产生附加信息。select_options是SELECT语句的查询选项,包括FROM WHERE子句等。 例如:

> EXPLAIN SELECT * FROM fruits

3. 合理的使用索引

创建索引:
mysql>CREATE INDEX index_name ON fruits(f_name)

或者:

mysql>alter table fruits add index index_name(f_name);
索引失效的几种情况:

1:使用like关键字的查询语句 在使用like关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。只有“%”不在第一个位置,索引才会起作用。

mysql> EXPLAIN SELECT * FROM fruits where f_name like 'x%'

2:使用多列索引的查询语句 mysql可以为多个字段创建索引。一个索引可以包括16个字段。对于多列索引,只有查询条件中使用了这些字段中第一个字段时,缩影才会被使用。

3:使用or关键字的查询语句 查询语句的查询条件中只有or关键字,且or前后的两个条件中都是索引时,查询中才使用索引。否则,查询将不适用索引。

mysql> EXPLAIN SELECT * FROM fruits WHERE f_name='apple' or s_id=101

4. 不同类型SQL语句优化方法

优化insert语句

:当进行数据insert的时候,mysql客户端大致要经过的步骤如下:

客户端连接mysql服务器客户端发送insert语句到服务器服务器解析insert语句服务器增加数据服务器给增加的记录添加索引服务器关闭连接

优化方法: (1) 根据以上步骤可以看出,如果从同一客户端插入很多行数据到mysql服务器,如果一次性插入多个值,将大大缩短客户端与数据库服务器之间连接和关闭等操作,例如:

insert into books values(1,'books1'),(2,'books2'),(3,'books3');

(2)对于MYISAM类型的表,如果从不同客户插入很多行,可以通过使用INSERT DELAYED 语句提升执行速度。INSERT DELAYED INTO 是客户端提交数据给MYSQL服务器,MYSQL服务器返回OK状态给客户端,而这并不是将数据立即插入到表,而是存储在内存里面等待排队,直到当MYSQL服务器有空闲时再插入。此时数据并没有真正写入到磁盘,这样的好处是提高插入数据的速度,不好的地方在于,如果系统崩溃,MySQL还没写入磁盘的数据将丢失。

(3)禁用唯一性检查 插入之前执行下面命令来禁止对唯一性索引的检查

SET UNIQUE_CHECKS=0

数据导入完成之后,执行下面的命令再开启对唯一性索引的检查

SET UNIQUE_CHECKS=1

(4)InnoDB中可以禁用外键检查 数据导入之前关闭

SET FOREIGN_KEY_CHECKS=0

数据导入之后开启外键检查

SET FOREIGN_KEY_CHECKS=1

优化ORDER BY 语句:

(1)对ORDER BY +LIMIT 组合的索引优化,sql形式如下:

SELECT [COLUMN1] ... FROM [TABLE] ORDER BY [SORT] LIMIT [OFFSET],[LIMIT];

该sql语句优化只需要在[sort]上建立索引即可。 (2)对WHERE +ORDER BY +LIMIT 组合的索引优化,SQL形式如下:

SELECT [COLUMN1] ... FROM [TABLE] WHERE [COLUMNX]=[VALUE] ORDER BY [SORT] LIMIT [OFFSET],[LIMIT];

此时如果只对[sort]添加索引,效率不是很高,还可以采用更加高效的方法建立一个联合索引(COLUMNX,SORT); (3)不要对WHERE 和ORDER BY 的选项使用表达式或者函数,SQL形式如下:

SELECT * FROM [TABLE] ORDER BY YEAR(DATE) LIMIT 0,30;

下面几种情况不应该使用索引: (1)order by的字段混合使用desc和asc

mysql>select * from ordertable order by col1 desc,col2 asc

(2)where子句使用的字段和order by的字段不一致

mysql>select * from ordertable where col1=1 order col2

(3)对不同的关键字使用order by排序

mysql>select * from ordertable order by col1,col2

优化GROUP BY子句

使用GROUP BY语句,NYSQL会对符合的结果自动排序。通过扫描整个表并创建一个新的临时表,表中每个组的所有行为应该是连续的,然后使用该临时表来找到组并应用累计行数。在某些情况下,MYSQL可以通过所有访问而不用临时表。通过指定order by null可以禁止排序,从而节省耗损。

mysql>explain select id ,count(data) from test group by id order by null;

使用order by null 的group by 语句减少了文件排序的步骤,当返回结果集很大时,对于group by的性能是有很大改善的。

优化嵌套查询

执行子查询时,mysql需要为内层查询语句的查询结果建立一个临时表,然后外层查询语句从临时表中查询记录。查询完毕后再撤销这些临时表,因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大。 在mysql中可以使用连接(join)查询来替代子查询,连接查询不需要建立临时表,其速度比子查询要快,如果查询中使用索引的话,性能会更好。

优化OR条件

对于使用OR条件语句的子查询,如果要使用索引,则OR之间的每个条件列都必须使用到索引。如果没有索引,可以考虑添加索引。

优化数据库结构

将字段很多的表分解成多个表增加中间表增加冗余字段
最新回复(0)