您的位置:首页 > 数据库 > MySQL

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:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: