MySQL优化攻略,索引,调度策略,批量,存储引擎…

  •   
  • 3460
  • MySQL
  • 8
  • super_dodo
  • 2014/12/14

MySQL优化攻略

1.设置索引条件
a.较频繁的作为查询条件字段的应该创建索引
b.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
c.更新非常频繁的字段不合适创建索引
d.不会出现在WHERE子句中的字段不该创建索引

2.索引不会被使用的情况
a.如果条件中有or,即使其中有条件带索引也不会使用
b.对于多列索引,不是使用的第一部分,则不会使用索引,最左原则.
c.Like是以%开头的
d.如果列类型是字符串,那一定要在条件中将数据使用引号引起来,否则不使用索引.
e.如果Mysql估计使用全表扫描要比使用索引快,则不使用索引。

3.大批量插入数据
MyISAM :
ALTER TABLE tab_name DISABLE KEYS;
loading data;
ALTER TABLE tab_name ENABLE KEYS;

InnoDB
a.要导入的数据按照主键排序
b.SET UNIQUE_CHECK=0; //关闭唯一性校验 (后再开启)
c.SET AUTOCOMMIT=0; //关闭自动提交 (后再开启)

4.存储引擎的选择
MyISAM:读插入操作为主,很少更新删除操作,并且对事物的完整性并发性不是很高,优势访问速度快
InnoDB:有提交回滚崩溃回复能力的事务安全。写的效率差,占更多磁盘空间。

5.常见的SQL优化手段
a.使用ORDER BY NULL 可禁用排序.GROUP BY 默认带排序.
b.对于精确度要求高的系统,使用decimal数据类型来存储.
c.使用join代替子查询,join不需要创建临时表.
d.如果or连接,则连接的字段必须都有索引才会使用索引,否则不会.
e.日期类型可以使用int来存储,32位和64位系统的日子上限不一样.

6.数据库的其他优化
a.服务器的内存超过4G,操作系统是64位的,建议用64位的MySQL
b.调整数据库的配置.(空间换时间)
c.读写分离(主库--丛库)

7.优化INSERT语句
a.如果同时从一个客户端插入多行,使用多个值表的INSERT语句,比分开INSERT语句快(一些情况下的N倍)
INSERT INTO table_name VALUES(1,2),(1,3),(1,4)...
b.如果从不同客户端插入很多行,能够使用INSERT DELAYED语句得到更高的速度
DELAYED的含义是让INSERT语句马上执行,其实数据都放在内存中,并没有真正写入磁盘。这比每条语句分别插入快得多.LOW_PRIORITY刚好相反(读写完后才插入)
c.将索引文件和数据文件分别在不同磁盘上存放(利用建表中的选项)
d.如果批量插入可以增减bulk_insert_buffer_size变量值的方法来提高速度。仅对MyISAM
e.当从一个文本文件载装一个表时,使用LOAD_DATA_INFILE,这通常比使用很多的INSERT语句快20倍。
f.根据应用情况,使用replace语句代替insert.
g.根据应用情况,使用ignore关键字忽略重复记录。

8.优化GROUP BY语句
默认情况下,MySQL排序所有GROUP BY col1,col2....查询方法如同在查询中指定ORDER BY col1,,col2.。如果显式包括一个包含相同的列的ORDER BY子句,MySQL可以好不减速的对它进行优化,尽量仍然进行排序。
例如: SELECT a.count(*) FROM bar GROUP BY a ORDER BY NULL

9.MySQL默认的调度策略。
a.写入操作优于读取操作.
b.对某张表的写入操作再某一时刻只能发生一次。写入操作按他们到达的顺序来处理。
c.对某张表的多个读取操作可以同时进行。
d.MySQL提供了几个语句调节符,允许你修改它的调度策略。
LOW_PRIORITY HIGH_PRIORITY DELAYED

10.MySQL的其他优化措施
a.使用持久的连接数据库以避免连接开销。
b.充分利用列有默认值的事实,可减少MySQL需要做的语法分析而提高插入速度。
c.经常检查所有查询确实使用了必要的索引。
d.避免在频繁更新的表上执行复杂的SELECT查询,以避免与锁定表有关的由于读写冲突问题。
e.对于没有删除的行的操作的MyISAM表,插入操作和查询操作可以并行进行,因为没有删除操作的表查询期间不会阻塞插入操作。对于确实需要执行删除操作的表。尽量在空闲时间进行批量删除操作。避免阻塞其他操作。

难到神说你该死,你就去死吗?