MySQL性能优化的最佳20+条经验

今天,数据库的操作越来越成 为整个应用的性能瓶颈了,这点对于 Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事 情。当我们去设计数据库表结构,对 操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的 性能。这里,我们不会 讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。
1. 为查询缓存优化你的查询
大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时 候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。 Continue reading

关于MySql explain 中的ID

root@test 10:56:20>explain SELECT T0.*
->   FROM
-> PRODUCT_0000 T0,
-> PRODUCT_0003 T3
->  WHERE T0.ID = T3.id
->    AND T0.AUC_ID =5120001280;
+----+-------------+-------+--------+-------------------------+-----------------+---------+--------------------+------+-------------+
| id | select_type | table | type   | possible_keys           | key             | key_len | ref                | rows | Extra       |
+----+-------------+-------+--------+-------------------------+-----------------+---------+--------------------+------+-------------+
|  1 | SIMPLE      | T0    | ref    | PRIMARY,idx_aa_0000_aid | idx_aa_0000_aid | 9       | const              |    1 | Using where |
|  1 | SIMPLE      | T3    | eq_ref | PRIMARY                 | PRIMARY         | 8       | test.T0.id |    1 | Using index |
+----+-------------+-------+--------+-------------------------+-----------------+---------+--------------------+------+-------------+
2 rows in set (0.00 sec) Continue reading

(转)Mysql limit 优化,百万至千万级快速分页,--复合索引的引用并应用于轻量级框架

MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始。有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了10万,百万至千万,他的性能还能那么高吗?一点小小的失误,可能造成整个系统的改写,甚至更本系统无法正常运行!好了,不那么多废话了。用事实说话,看例子:

数据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是逐渐,vtype是tinyint,vtype是索引。这是一个基本的新闻系统的简单模型。现在往里面填充数据,填充10万篇新闻。 Continue reading

mysql的limit优化实例

测试环境

操作系统: debian linux

服务器版本: Mysql 5.0.24

Mysql数据库的Qcache缓存关闭

数据库表testtable的参数:

类型:     MyISAM 大小:     >80MB 记录规模: >50000 字段数:   >25个字段

id是主键 leibie字段上建有索引

进行数据分段测试

1>SQL不带where条件的测试

1)50290行开始 显示行 0 - 9 (10 总计, 查询花费 0.2647 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 50290 , 10 Continue reading

mysql查询中in和多个or的区别

比较IN()里面的数据
许多数据库服务器都只把IN()看作多个OR的同义词,因为它们在逻辑上是相等的。MYSQL不是这样的,它会对IN()里面的数据进行排序,然后用二分法查找个是否在列表中,这个算法的效率是O(Logn),而等同的OR子句的查找效率是O(n)。在列表很大的时候,OR子句就会变得慢得多。

这里的语句和Oracle数据库里是一样的。

mysql优化一般步聚(教程)

1.1优化SQL的一般步骤

11.1.1 通过show status和应用特点了解各种SQL的执行频率

通过SHOW STATUS可以提供服务器状态信息,也可以使用mysqladminextended- status命令获得。SHOW STATUS可以根据需要显示session级别的统计结果和global 级别的统计结果。

以下几个参数对Myisam和Innodb存储引擎都计数:

1. Com_select 执行select操作的次数,一次查询只累加1;

2. Com_insert执行insert操作的次数,对于批量插入的insert操作,只累加一次;

3. Com_update执行update操作的次数;

4. Com_delete 执行delete操作的次数; Continue reading

mysql limit查询优化

MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。 

同样是取10条数据

select * from yanxue8_visit limit 10000,10 和
select * from yanxue8_visit limit 0,10
就不是一个数量级别的。

网上也很多关于limit的五条优化准则,都是翻译自mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。

文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核 (3GHZ) +4G内存 mysql 5.0.19)

1、offset比较小的时候。

select * from yanxue8_visit limit 10,10

多次运行,时间保持在0.0004-0.0005之间
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10,1
) limit 10

多次运行,时间保持在0.0005-0.0006之间,主要是0.0006
结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。

2、offset大的时候。
select * from yanxue8_visit limit 10000,10

多次运行,时间保持在0.0187左右
Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10000,1
) limit 10

多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。

以后要注意改正自己的limit语句,优化一下mysql了.

注意这里的条件是没有where条件的情况下,对于有where条件的情况下请参考另一篇文章:http://blog.haohtml.com/archives/3747