MySQL优化的一点记录。
2015-08-31 11:30
471 查看
关于mysql调优的一点记录
对于数据库的性能瓶颈,影响第一位的是sql语句。所有对于sql的优化是数据库性能的基本处理,也是代价最小的。
其他的影响因素依次包括(IO性能、CPU处理能力、服务器内存DRAM、网络速度IOPS、磁盘大小)。
Mysql优化的分类
a:sql语句的使用
b:表的合理化设计
c:添加索引
d:Mysql配置的优化
e:分表的设计
f:读写分离
g:存储过程:将经常使用的sql进行存储过程,比如分页;
h:服务器的硬件升级
I:定时清除不需要的数据,定时进行碎片整理。
1.将经常要用到的字段(比如经常要用这些字段来排序,或者用来做搜索),则最好将这些字段设为索引。
2.字段的种类尽可能用int 或者tinyint类型。另外字段尽可能用NOT NULL。
3.当然无可避免某些字段会用到text ,varchar等字符类型,最好将text字段的单独出另外一个表出来(用主键关联好)
4.字段的类型,以及长度,是一个很考究开发者优化功力的一个方面。如果表数据有一定的量了,不妨用PROCEDURE ANALYSE()
命令来取得字段的优化建议!(在phpmyadmin里可以在查看表时,点击 “Propose table structure” 来查看这些建议) 如此
可以让你的表字段结构 趋向完善。
5.select * 尽量少用,你想要什么字段 就select 什么字段出来 不要老是用* 号!同理,只要一行数据时尽量使用 LIMIT 1
6.绝对不要轻易用order by rand() ,很可能会导致mysql的灾难!!
7.每个表都应该设置一个ID主键,最好的是一个INT型,并且设置上自动增加的AUTO_INCREMENT标志,这点其实应该
作为设计表结构的第一件必然要做的事!!
8.拆分大的 DELETE 或 INSERT 语句。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了,就我来说 有时候
我宁愿用for循环来一个个执行这些操作。
9.不要用永久链接 mysql_pconnect();除非你真的非常肯定你的程序不会发生意外,不然很可能也会导致
mysql死掉。
10.永远别要用复杂的mysql语句来显示你的聪明。就我来说,看到一次关联了三,四个表的语句,只会让人觉得很不靠谱。
11.开启缓存查询。
12.使用EXPLAIN 对复杂的SELECT 查询 ,进行比较调优。
13.对于会使用LIKE%%查询的字段建立索引。
14.使用
ENUM 而不是 VARCHAR 。对于选项型数据,使用枚举存储。例如国家,民族,省份等等。
15.无缓存查询,mysql_unbuffered_query()
较 mysql_query() 节约内存,不会去查找缓存中的记录。
16.固定长度的表会更快,
如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,
表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表
就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。 固定长度的表会提高性能,
因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的
自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。 并且,固定
长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的
字段无论你用不用,他都是要分配那么多的空间。
17.选择正确的存储引擎
在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。有文章《MySQL: InnoDB
还是 MyISAM?》讨论和这个事情。 MyISAM
适合于一些需要大量查询的应用,但其对于有大量写操作
并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无
法操作直到读操作完成。另外,MyISAM 对于 SELECT
COUNT(*) 这类的计算是超快无比的。 InnoDB
的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM
还慢。他是它支持“行锁”
,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
-----
1: with rollup 不能和order by 同时使用。
2:关于count(*)的优化:
在使用count()
通过where查询统计个数时,数据比较大的情况下,使用count((distinct 字段) where
字段 ** 且 该字段要建立索引。
如 $mysqli->query("select count(distinct id) as cc from article where year(createtime)='2015'");
统计创建时间是2015年的文章的总数,使用主键id,也可以使用其他有索引的字段。
3:
对于数据库的性能瓶颈,影响第一位的是sql语句。所有对于sql的优化是数据库性能的基本处理,也是代价最小的。
其他的影响因素依次包括(IO性能、CPU处理能力、服务器内存DRAM、网络速度IOPS、磁盘大小)。
Mysql优化的分类
a:sql语句的使用
b:表的合理化设计
c:添加索引
d:Mysql配置的优化
e:分表的设计
f:读写分离
g:存储过程:将经常使用的sql进行存储过程,比如分页;
h:服务器的硬件升级
I:定时清除不需要的数据,定时进行碎片整理。
1.将经常要用到的字段(比如经常要用这些字段来排序,或者用来做搜索),则最好将这些字段设为索引。
2.字段的种类尽可能用int 或者tinyint类型。另外字段尽可能用NOT NULL。
3.当然无可避免某些字段会用到text ,varchar等字符类型,最好将text字段的单独出另外一个表出来(用主键关联好)
4.字段的类型,以及长度,是一个很考究开发者优化功力的一个方面。如果表数据有一定的量了,不妨用PROCEDURE ANALYSE()
命令来取得字段的优化建议!(在phpmyadmin里可以在查看表时,点击 “Propose table structure” 来查看这些建议) 如此
可以让你的表字段结构 趋向完善。
5.select * 尽量少用,你想要什么字段 就select 什么字段出来 不要老是用* 号!同理,只要一行数据时尽量使用 LIMIT 1
6.绝对不要轻易用order by rand() ,很可能会导致mysql的灾难!!
7.每个表都应该设置一个ID主键,最好的是一个INT型,并且设置上自动增加的AUTO_INCREMENT标志,这点其实应该
作为设计表结构的第一件必然要做的事!!
8.拆分大的 DELETE 或 INSERT 语句。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了,就我来说 有时候
我宁愿用for循环来一个个执行这些操作。
9.不要用永久链接 mysql_pconnect();除非你真的非常肯定你的程序不会发生意外,不然很可能也会导致
mysql死掉。
10.永远别要用复杂的mysql语句来显示你的聪明。就我来说,看到一次关联了三,四个表的语句,只会让人觉得很不靠谱。
11.开启缓存查询。
12.使用EXPLAIN 对复杂的SELECT 查询 ,进行比较调优。
13.对于会使用LIKE%%查询的字段建立索引。
14.使用
ENUM 而不是 VARCHAR 。对于选项型数据,使用枚举存储。例如国家,民族,省份等等。
15.无缓存查询,mysql_unbuffered_query()
较 mysql_query() 节约内存,不会去查找缓存中的记录。
16.固定长度的表会更快,
如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,
表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表
就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。 固定长度的表会提高性能,
因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的
自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。 并且,固定
长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的
字段无论你用不用,他都是要分配那么多的空间。
17.选择正确的存储引擎
在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。有文章《MySQL: InnoDB
还是 MyISAM?》讨论和这个事情。 MyISAM
适合于一些需要大量查询的应用,但其对于有大量写操作
并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无
法操作直到读操作完成。另外,MyISAM 对于 SELECT
COUNT(*) 这类的计算是超快无比的。 InnoDB
的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM
还慢。他是它支持“行锁”
,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
-----
1: with rollup 不能和order by 同时使用。
2:关于count(*)的优化:
在使用count()
通过where查询统计个数时,数据比较大的情况下,使用count((distinct 字段) where
字段 ** 且 该字段要建立索引。
如 $mysqli->query("select count(distinct id) as cc from article where year(createtime)='2015'");
统计创建时间是2015年的文章的总数,使用主键id,也可以使用其他有索引的字段。
3:
相关文章推荐
- mysql 里对root及普通用户赋权及更改密码的一些命令
- MySQL数据库备份以及常用备份工具集合
- MySQL和SQLServer批量插入的SQL语句区别
- SSD 下的 MySQL IO 优化尝试
- WIN windows 2008 定时 自动 备份mysql数据库
- MySQL Workbench批量更新或删除
- mysql 免安装版配置
- Mysql 常用引擎的特点及选择使用策略
- Ubuntu Server 12.04 安装mysql 5.6.10
- 【MySql】存储过程限定月份,限定某天等基础的使用
- MySQL基本操作(三):全文本搜索
- MySQL主从配置
- 【MySql】 MySQL存储过程常用的函数(字符串类型操作,数学类,日期时间类)
- 【MySql】MySQL的转义字符“\” \'使用说明
- 【MySql】MySql基础使用详解
- 【mysql】mysql 小数转换成百分数查出(保留两位小数百分数)以及怎么使select中嵌套if的使用
- 【mysql】Mysql数据库备份和按条件导出表数据
- MySQL索引 查看、创建、删除
- mysql如何修改所有的definer
- MySQL和MSSQL差异(增量)备份的原理