数据库优化中的sql语句优化

MySql数据库的优化方式

硬件的优化

操作系统的优化

MySql系统配置的优化

MySql语句的优化---SQL语句的优化是将性能低下的SQL语句转换成目的相同但是性能优异的SQL语句。

Sql语句的优化部分举例

1. inner join内连接也叫等值连接是,left/right join是外连接。

内连接比外连接快,能使用内连接尽量使用内连接.

2.尽量把牵涉到多表联合的查询拆分多个query 多个链表查询效率相对较低。

--查询一个表获得字段--外键然后利用这个字段去查询另一个表的对应行


3.分页查询时limit 的基数比较大时使用 between

select * from admin order by admin_id limit 100000,10

优化为:select * from admin where admin_id between 100000 and 100010 order by admin_id。

如果我们只是想查询比较靠后的数据,进行desc排序反向查找,保证limit基数较小即可。

4.为经常用来做搜索的字段,为其建立索引.但是使用不正确的sql语句会导致索引无法使用,依然会使用全表扫描的方式获取数据。

索引:一种已经排好序的数据结构,帮助数据库实现快速查找数据 每条索引保存数据库中的行记录地址,查找到对应的索引后将硬盘中的数据读取到内存中可以类比数组结构 查询快 增删改慢。

5 尽量避免在列上做运算,将在每个行进行运算,这样会导致索引失效

select * from admin where year(admin_time)>2014

优化为:

select * from admin where admin_time> '2014-01-01′


6.程序中如果一次性对同一个表插入多条数据

比如以下语句:

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);

7.尽量避免Select * 命令,从表中读取越多的数据,查询会变得更慢。它会增加磁盘的操作时间,占用更多的内存,如果在数据库服务器与web服务器是独立分开的情况下还会造成一定的网络延迟。因为不必要的数据在服务器之间传输占用资源。

8应尽量避免在 where 的子句中对索引字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

9.尽量避免在索引过的字符数据中,使用非打头字母搜索。

这也使得引擎无法利用索引来进行筛选

SELECT * FROM T1 WHERE NAME LIKE ‘%L%'

SELECT * FROM T1 WHERE NAME LIKE ‘L%'

即使NAME字段建有索引,第一种查询方法依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第二个查询能够使用索引来加快操作 尽量不要使用 ‘%L%'这种方式(会导致全表扫描),如果可以使用`L%'相对来说更好;

10.利用limit 1取得唯一行或多行

A.有时要查询一张表时,你要知道需要看一行,你可能去查询一条独特的记录。你可以使用limit 1.来终止数据库引擎继续扫描整个表或者索引,如:

Select * from A where namelike ‘%xxx’ limit 1;

这样只要查询到一条符合like ‘%xxx’的记录,那么引擎就不会继续扫描表或者索引了。

11.尽量不要使用BY RAND()命令, 这样使用只让你的数据库的性能呈指数级的下降。这里的问题是:MySQL会不得不去执行RAND()函数 (很耗CPU时间),而且这是为了每一行记录去执行,然后再对其排序。就算是你用了Limit 1也无济于事(因为要排序).我们可以查询出所有的结果再使用其他代码进行单条选取


12拆分大的 DELETE 或 INSERT 语句如果你需要在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询,因为这两个操作是会锁表,表一锁住了,别的操作都进不来了。

mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000"


13应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or num=20

可以这样查询:

select id from t where num=10

union all/union

select id from t where num=20


14.尽量用union all 代替union .union和union all的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的cpu运算,加大资源消耗及延迟。所以当 我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用union all而不是union。

举报
评论 0