一、查询性能优化 重构查询方式
1、一个复杂查询还是多个简单查询
MySQL内部每秒能够扫描内存中上百万行数据,相比之下,MySQL响应数据给客户端就慢得多了。在其他条件都相同的时候,使用尽可能少的查询当然是更好的。但是有时候,将一个大查询分解为多个小查询也是很有必要的。
2、切分查询
有时候对于一个大查询我们需要“分而治之”,对于删除旧数据,如果用一个大的语句一次性完成的话,则可能需要一次性锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。将一个大的DELETE语句切分成多个较小的查询可以尽可能小地影响MySQL性能,同时还可以减少MySQL复制的延迟。例如我们需要每个月运行一次下面的查询:
那么可以用类似下面的办法来完成同样的工作:
3、分解关联查询
二、数据库大小
1、查询语句 得到的结果是以字节为单位,除1024为K,除1048576为M
SELECT SUM(DATA_LENGTH)/1073741824,SUM(INDEX_LENGTH)/1073741824,
(SUM(DATA_LENGTH)+SUM(INDEX_LENGTH))/1073741824
FROM information_schema.TABLES WHERE TABLE_SCHEMA='数据库名';
2、查看数据库中各个表占用的空间大小
SELECT TABLE_NAME,(DATA_LENGTH+INDEX_LENGTH)/1073741824,
TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='数据库名' AND TABLE_NAME='表名';
--全表
SELECT TABLE_NAME,(DATA_LENGTH+INDEX_LENGTH)/1073741824,
TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='数据库名';
3、关于删除数据后物理空间未释放
OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。OPTIMIZE TABLE 是指对表进行优化。如果已经删除了表的一大部分数据,或者如果已经对含有可变长度行的表(含有 VARCHAR 、 BLOB 或 TEXT 列的表)进行了很多更改,就应该使用 OPTIMIZE TABLE 命令来进行表优化。这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 。OPTIMIZE TABLE 命令只对 MyISAM 、 BDB 和 InnoDB 表起作用 。表优化的工作可以每周或者每月定期执行,对提高表的访问效率有一定的好处,但是需要注意的是,优化表期间会锁定表,所以一定要安排在空闲时段进行。
参考资料:
《高性能MySQL》