如何优化Mysql数据库

1、添加主键ID

2、尽量避免使用select * form table

3、创建索引
     对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是

一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个

值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。
4、复合索引
     比如有一条语句是这样的:select * from users where area=‘beijing‘ and age=22;如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已

经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area,
age,
salary)的复合索引,那么其实相当于创建了

(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。
4、索引不会包含有NULL值的列
     只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
5、使用短索引
     对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询

速度而且可以节省磁盘空间和I/O操作。
6、排序的索引问题
    mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个

列的排序,如果需要最好给这些列创建复合索引。
7、like语句操作
     一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
8、不要在列上进行运算
     select * from users where YEAR(adddate)<2007;将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成select * from users where adddate<‘2007-01-01‘;
9、不使用NOT IN和<>操作
     NOT IN和<>操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替。

10、优化mysql查询缓存

在MySQL服务器上进行查询,可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有效方法之一。当同一个查询被执行多次时,如果结果是从缓存中提取,那是相当快的。
但主要的问题是,它是那么容易被隐藏起来以至于我们大多数程序员会忽略它。在有些处理任务中,我们实际上是可以阻止查询缓存工作的。
1. // query cache does NOT work
2. $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
3.
4. // query cache works!
5. $today = date("Y-m-d");
6. $r = mysql_query("SELECT username FROM user WHERE signup_date >= ‘$today‘");
7.
8. // query cache does NOT work
9. $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
10.
11. // query cache works!
12. $today = date("Y-m-d");
13. $r = mysql_query("SELECT username FROM user WHERE signup_date >= ‘$today‘");

11. 利用LIMIT 1取得唯一行
有时,当你要查询一张表是,你知道自己只需要看一行。你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数,他们都满足了你的WHERE子句。
在这种情况下,增加一个LIMIT 1会令你的查询更加有效。这样数据库引擎发现只有1后将停止扫描,而不是去扫描整个表或索引。
1. // do I have any users from Alabama?
2. // what NOT to do:
3. $r = mysql_query("SELECT * FROM user WHERE state = ‘Alabama‘");
4. if (mysql_num_rows($r) > 0) {
5. // ...
6. }
7. // much better:
8. $r = mysql_query("SELECT 1 FROM user WHERE state = ‘Alabama‘ LIMIT 1");
9. if (mysql_num_rows($r) > 0) {
10. // ...
11. }

12. 不要使用BY RAND()命令
这是一个令很多新手程序员会掉进去的陷阱。你可能不知不觉中制造了一个可怕的平静。这个陷阱在你是用BY RAND()命令时就开始创建了。
如果您真的需要随机显示你的结果,有很多更好的途径去实现。诚然这需要写更多的代码,但是能避免性能瓶颈的出现。问题在于,MySQL可能会为表中每一个独立的行执行BY RAND()命令(这会消耗处理器的处理能力),然后给你仅仅返回一行。
1. // what NOT to do:
2. $r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");
3. // much better:
4. $r = mysql_query("SELECT count(*) FROM user");
5. $d = mysql_fetch_row($r);
6. $rand = mt_rand(0,$d[0] - 1);
7.
8. $r = mysql_query("SELECT username FROM user LIMIT $rand, 1");

时间: 2025-02-01 08:44:28

如何优化Mysql数据库的相关文章

优化MYSQL数据库的方法

1.选取最适用的字段属性 尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM 2.使用连接(JOIN)来代替子查询:  a.删除没有任何订单客户 ELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo) b.提取所有没有订单客户 SELECT FROM customerinfo WHERE customerid NOT in(SELECT cust

性能优化——mysql数据库

一 mysql常用命令 1. 打开日志 1) show global variables like "%genera%"; 2)set global general_log=on; 3)set global general_log=off; 2. mysql如果开了set autocommit=0,那么所有的语句一定是在一个事务里 3. show engine innodb status 1) http://imysql.cn/2008_05_22_walk_through_show_

mysql的MyISAM 和 InnoDB 的区别?优化MYSQL数据库的方法?

MyISAM 和 InnoDB 的基本区别 1.InnoDB不支持FULLTEXT类型的索引. 2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可.注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的. 3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他

网站访问量大 怎样优化mysql数据库

MySQL优化的一些建议,单机MySQL的优化我分为三个部分,一是服务器物理硬件的优化,二是 MySQL安装时的编译优化,三是自身配置文件my.cnf的优化:如果单机的优化也解决不了你的数据库的压力的话,那这个时候就只有考虑采用集群架构的 方法,这个我在后面也会重点说明. 单机MySQL数据库的优化 一.服务器硬件对MySQL性能的影响 ①磁盘寻道能力 (磁盘I/O),我们现在上的都是SAS15000转的硬盘.MySQL每秒钟都在进行大量.复杂的查询操作,对磁盘的读写量可想而知.所以,通常认为磁

优化MySQL数据库性能的八大方法

本文探讨了提高MySQL 数据库性能的思路,并从8个方面给出了具体的解决方法. 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小.例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了.同样的,如果可以的话,我们应该

优化mysql数据库的几个步骤

分析问题的几个步骤: 1. 开启慢查询日志. 这个步骤就是为了记录慢查询的sql,为下个步骤做准备,此步骤相关的知识点有如下: 1. show variables like '%slow_query_log%'; 查看慢查询的日志记录是否开启. 2. set global slow_query_log=1;  设置慢查询开启. 2. 用explain 分析sql 语句. ps: explain  select *  from temp 得到如下图所示: 通过这个步骤的分析基本能找到问题出现在哪?

优化MySQL数据库查询

在优化查询中,数据库应用(如MySQL)即意味着对工具的操作与使用.使用索引.使用EXPLAIN分析查询以及调整MySQL的内部配置可达到优化查询的目的. 任何一位数据库程序员都会有这样的体会:高通信量的数据库驱动程序中,一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉更多的数据库时间,且它将对其他应用组件产生影响. 如同其它学科,优化查询性能很大程度上决定于开发者的直觉.幸运的是,像MySQL这样的数据库自带有一些协助工具.本文简要讨论诸多工具之三种:使用索引,使用E

如何更好的优化MySQL数据库

1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快 因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小. 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间 甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了 同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段 另外一个提高效率的方法是

谈谈如何优化MYSQL数据库查询

1.优化数据类型 MySQL中数据类型有多种,如果你是一名DBA,正在按照优化的原则对数据类型进行严格的检查,但开发人员可能会选择他们认为最简单的方案,以加快编码速度,或者选择最明显的选择,因此,你可能面临的都不是最佳的选择,如果可能的话,你应该尝试以通用准则来改变这些决定. (1)避免使用NULL NULL对于大多数数据库都需要特殊处理,MySQL也不例外,它需要更多的代码,更多的检查和特殊的索引逻辑,有些开发人员完全没有意识到,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,