设为首页 加入收藏

TOP

MYSQL设计优化(二)
2015-11-21 02:09:29 来源: 作者: 【 】 浏览:4
Tags:MYSQL 设计 优化
以给表创建一个主键,将可以利用这个优势提高导入数据的效率。
②在导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。
SET UNIQUE_CHECKS=0;
SET UNIQUE_CHECKS=1;
③如果使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动提交,导入结束后再执行SET AUTOCOMMIT=1,打开自动提交,也可以提高导入的效率。
SET AUTOCOMMIT=0;

SET AUTOCOMMIT=1;

2)优化insert语句

1)如果同时插入很多行,请使用多个值的INSERT语句。这比使用分开INSERT语句快(在一些情况中几倍)。
Insert into test values(1,2),(1,3),(1,4)…
2)如果从不同客户插入很多行,能通过使用INSERT DELAYED 语句得到更高的速度。
Delayed 的含义是让insert 语句马上执行,其实数据都被放在内存的队列中,并没有真正写入磁盘;这比每条语句分别插入要快的多;
LOW_PRIORITY 刚好相反,在所有其他用户对表的读写完后才进行插入;
3)将索引文件和数据文件分在不同的磁盘上存放(利用建表中的选项);
4)如果批量插入,可以增加bulk_insert_buffer_size变量值的方法来提高速度,但是,这只能对myisam表使用;
5)当从一个文本文件装载一个表时,使用LOAD DATA INFILE。这通常比使用很多INSERT语句快20倍;
6)根据应用情况使用 replace 语句代替 insert;
7)根据应用情况使用 ignore 关键字忽略重复记录。
INSERT DELAYED INTO mytable(id, username, city, age) VALUES(4, 'name4', 'city4', 40);
INSERT LOW_PRIORITY INTO mytable(id, username, city, age) VALUES(5, 'name5', 'city5', 50);
REPLACE INTO mytable(id, username, city, age) VALUES(5, 'name5', 'city5', 50);

INSERT IGNORE INTO mytable(id, username, city, age) VALUES(5, 'name5', 'city5', 50);

3)优化group by语句

默认情况下,MySQL排序所有GROUP BY col1,col2,....(如同指定了ORDER BY col1,col2,...)
如果查询包括GROUP BY但想避免排序结果的消耗,可以指定 ORDER BY NULL禁止排序。
例如:

SELECT * FROM mytable GROUP BY username ORDER BY NULL;

4)优化order by语句

以下情况可以使用索引:
SELECT * FROM t1 ORDER BY key_part1,key_part2,... ; --order by字段都为同一组合索引的一部分
SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, --key_part2 DESC;--where条件和order by使用相同的索引字段
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;--order by的的所有字段顺序相同
以下情况不使用索引:
1)SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;--order by的字段混合ASC和DESC
2)SELECT * FROM t1 WHERE key2=constant ORDER BY key1;--用于查询行的关键字与ORDER BY中所使用的不相同

3)SELECT * FROM t1 ORDER BY key1, key2;--对不同的关键字使用ORDER BY

5)优化join语句

Mysql4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。
使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。
但是,有些情况下,子查询可以被更有效率的连接(JOIN).. 替代。

假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成:
SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
如果使用连接(JOIN).. 来完成这个查询工作,速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话,性能将会更好,查询如下:
SELECT * FROM customerinfo
LEFT JOIN salesinfo ON customerinfo.CustomerID=salesinfo.CustomerID
WHERE salesinfo.CustomerID IS NULL

连接(JOIN).. 之所以更有效率一些,是因为 MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。

6)insert update delete的调度优先级

MySQL还允许改变语句调度的优先级,使来自多个客户端的操作更好地协作(需要判断应用是以查询为主还是以更新为主的)。
以下改变调度策略的方法主要是针对Myisam存储引擎的(对于Innodb存储引擎,语句的执行是由获得行锁的顺序决定的)
默认调度策略:
1)写入操作优先于读取操作。
2)对某张数据表的写入操作某一时刻只能发生一次,写入请求按照它们到达的次序来处理。
3)对某张数据表的多个读取操作可以同时地进行。
语句调节符可以修改调度策略(以下是查询为主的):
1)LOW_PRIORITY 关键字应用于 DELETE 、 INSERT 、 LOAD DATA 、 REPLACE和UPDATE 。
2)HIGH_PRIORITY关键字应用于SELECT和INSERT语句。
3)DELAYED关键字应用于INSERT和REPLACE语句。
如果写入操作是一个LOW_PRIORITY(低优先级)请求,那么读取操作优先级会高于写操作。(在这种情况下,如果写入者在等待的时候,第二个读取者到达了,那么就允许第二个读取者插到写入者之前。只有在没有其它的读取者的时候,才允许写入者开始操作。这种调度方式可能存在LOW_PRIORITY的写入操作永远被阻塞的情况。)

SELECT查询被设置为HIGH_PRIORITY(高优先级),则也会调整SELECT操作到正在等待的写入操作之前。

设置方式:

1)启动方式

如果你希望所有支持LOW_PRIORITY选项的语句都默认地按照低优先级来处理,那么请使用--low-priority-updates选项来启动服务器。

2)sql方式

通过使用INSERT HIGH_PRIORITY来把INSERT语句提高到正常的写入优先级,可以消除该选项对单个INSERT语句的影响。
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql 简单的增删改查语句 下一篇mysql编码设置

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: