mysql查询优化技巧

索引优化,查询优化,查询缓存,服务器设置优化,操做系统和硬件优化,应用层面优化(web服务器,缓存)等等。这里记录的优化技巧更适合开发人员,都是从网络上搜集和整理的,主要是查询语句上的优化,其余层面上的优化技巧在此不作记录。mysql

查询的开销指标:执行时间,检查的行数,返回的行数。web

创建索引的几个准则:sql

(1)合理的创建索引可以加速数据读取效率,不合理的创建索引反而会拖慢数据库的响应速度。数据库

(2)索引越多,更新数据的速度越慢。缓存

(3)尽可能在采用MyIsam做为引擎的时候使用索引(由于MySQL以BTree存储索引),而不是InnoDB。但MyISAM不支持Transcation。服务器

(4)当你的程序和数据库结构/SQL语句已经优化到没法优化的程度,而程序瓶颈并不能顺利解决,那就是应该考虑使用诸如memcached这样的分布式缓存系统的时候了。 网络

(5) 习惯和强迫本身用EXPLAIN来分析你SQL语句的性能。分布式

 

1、count的优化memcached

 (1). select count(*) from world.city where id > 5;函数

 (2). select (select count() from world.city) – count() from world.city where id <= 5; 

 1语句当行数超过11行的时候须要扫描的行数比2语句要多, 2语句扫描了6行,此种状况下,2语句比1语句更有效率。当没有where语句的时候直接select count(*)                 from world.city这样会更快,由于mysql老是知道表的行数。


2、索引字段上进行运算会使索引失效

尽可能避免在WHERE子句中对字段进行函数或表达式操做,这将致使引擎放弃使用索引而进行全表扫描。如: 

SELECT * FROM T1 WHERE F1/2=100 应改成: SELECT * FROM T1 WHERE F1=100*2

 

、避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操做符

由于这会使系统没法使用索引,而只能直接搜索表中的数据。例如: SELECT id FROM employee WHERE id != “B%” 优化器将没法经过索引来肯定将要命中的行数,所以         须要搜索该表的全部行。在in语句中能用exists语句代替的就用exists. 

 

、合理使用EXISTS,NOT EXISTS子句

 

、 可以用BETWEEN的就不要用IN

 

、 可以用DISTINCT的就不用GROUP BY

 

、尽可能不要用SELECT INTO语句。SELECT INTO 语句会致使表锁定,阻止其余用户访问该表

 

8、程序中若是一次性对同一个表插入多条数据

好比如下语句: 

insert into person(name,age) values(‘xboy’, 14);

insert into person(name,age) values(‘xgirl’, 15);

insert into person(name,age) values(‘nia’, 19);

 

把它拼成一条语句执行效率会更高.

insert into person(name,age) values(‘xboy’, 14), (‘xgirl’, 15),(‘nia’, 19);

相关文章
相关标签/搜索