MySQL优化
1.数据库设计要符合3F也就是通常说的三范式
1.1 第一范式是列具有原子性,即不可再分
1.2 第二范式是唯一性约束,数据具有唯一性
1.3 第三范式是数据库字段没有冗余,当然完全没有冗余字段的数据库也未必是最好用的
2.定位
2.1 需要定位效率低的sql,然后私用explain进行分析,进而使用相应的优化措施
3.常用命令
3.1 show [session|global] status like 'Com_XXX' XXX 可以是select、insert、update等
3.2 show [session|global] status like 'Slow_queries' 定位慢查询的条数,默认10s
注意:
在默认情况下mysql不记录慢查询日志,需要在启动的时候指定
bin\mysqld.exe - -safe-mode - -slow-query-log [mysql5.5 可以在my.ini指定]
bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]
4.为表建立适当的索引
4.1 字段不具有唯一性的不适合创建索引
4.2 字段会进行频繁的更新操作的字段不适合作为索引
4.3 字段不经常出现在where条件中的字段不适合作为索引
5.索引会被使用和不会被使用的场所
5.1 使用like的时候,当'%aaa'的时候索引不会被使用,'aaa%'此时索引才会被使用
5.2 where条件中有or的情况下,索引不会被使用,除非,or的前后两个条件都有索引的情况会被使用索引
5.3 重要的一点,也是大家经常忽略的一点,当被加索引的字段是字符串类型的时候,此时在where条件中
一定要用引号将值引起来,要不然使用不到索引,例如 name=aaa 应该写为 name='aaa'
6.MySQL常用优化
6.1 默认情况,MySQL对所有的group by col1,col2进行排序。这与在查询中指定order by col1, col2类似。
如果查询中包括group by但用户想要避免排序结果的消耗,则可以使用order by null禁止排序
6.2 有些情况下,可以使用连接来替代子查询。 因为使用join,MySQL不需要在内存中创建临时表。
1.数据库设计要符合3F也就是通常说的三范式
1.1 第一范式是列具有原子性,即不可再分
1.2 第二范式是唯一性约束,数据具有唯一性
1.3 第三范式是数据库字段没有冗余,当然完全没有冗余字段的数据库也未必是最好用的
2.定位
2.1 需要定位效率低的sql,然后私用explain进行分析,进而使用相应的优化措施
3.常用命令
3.1 show [session|global] status like 'Com_XXX' XXX 可以是select、insert、update等
3.2 show [session|global] status like 'Slow_queries' 定位慢查询的条数,默认10s
注意:
在默认情况下mysql不记录慢查询日志,需要在启动的时候指定
bin\mysqld.exe - -safe-mode - -slow-query-log [mysql5.5 可以在my.ini指定]
bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]
4.为表建立适当的索引
4.1 字段不具有唯一性的不适合创建索引
4.2 字段会进行频繁的更新操作的字段不适合作为索引
4.3 字段不经常出现在where条件中的字段不适合作为索引
5.索引会被使用和不会被使用的场所
5.1 使用like的时候,当'%aaa'的时候索引不会被使用,'aaa%'此时索引才会被使用
5.2 where条件中有or的情况下,索引不会被使用,除非,or的前后两个条件都有索引的情况会被使用索引
5.3 重要的一点,也是大家经常忽略的一点,当被加索引的字段是字符串类型的时候,此时在where条件中
一定要用引号将值引起来,要不然使用不到索引,例如 name=aaa 应该写为 name='aaa'
6.MySQL常用优化
6.1 默认情况,MySQL对所有的group by col1,col2进行排序。这与在查询中指定order by col1, col2类似。
如果查询中包括group by但用户想要避免排序结果的消耗,则可以使用order by null禁止排序
6.2 有些情况下,可以使用连接来替代子查询。 因为使用join,MySQL不需要在内存中创建临时表。