mysql性能优化举例

2026-05-10 19:07:25

1、1) 当只要一行数据时使用 LIMIT 1 

当你查询表的有些时候,你已经知道结果只会有一条结果,在这种情况下,加上 LIMIT    1 可以增加性能。这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。 

2、2)选择正确的存储引擎  

在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。

MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。       InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。 

3、3)用Not Exists 代替Not In

      Not Exists允许用户使用相关子查询已排除一个表中能够与另一个表成功连接的所有记录。Not Exists用到了连接,能够发挥已经建好的索引的作用,而Not In不能使用索引。Not In是最慢的方式,要同每条记录比较,在数据量比较大的查询中不建议使用这种方式。

Select a.mobileid from Log_user a where not exists (select b.mobileid from magazineitem b where b.mobileid=a.mobileid);

4、4)对操作符的优化 尽量不采用不利用索引的操作符

    如:in ,not in , is nul, is not null,<>等

某个字段你总要会经常用来做搜索,为其建立索引:

    Mysql中可以使用alter table语句来为表中的字段添加索引的基本语法是:     ALTER TABLE <表名> ADD INDEX (<字段>);

例:mysql> alter table test add index(t_name);

5、5)mysql分库分表:

分库分表有垂直切分和水平切分两种。 垂直切分:即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。 水平切分:当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表,和不同的库上。例如,我们的userDB中的用户数据表中,每一个表的数据量都很大,就可以把userDB切分为结构相同的多个userDB:part0DB、part1DB等,再将userDB上的用户数据表userTable,切分为很多userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上。

猜你喜欢