MySQL优化的一点记录。

本文介绍MySQL性能优化的方法,包括SQL语句优化、表结构设计、索引使用、配置调整等。探讨了如何通过合理的字段类型选择、缓存查询启用、存储引擎选择等方式提升数据库效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


关于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:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值