Mysql优化
2017-08-23 11:34
176 查看
一、索引相关
1.在一个大表上快速创建索引
可以考虑先导出数据,删除然后新建表,最后再将以前的数据导入,这样比在原有大数据量表上直接建索引快速一些
2.复杂查询查看sql执行计划(explain)
3.尽量少使用not in,not exist,not null这样的查询
4.对于多列索引,尽可能避免范围查询(因为范围查询字段后面的字段无法使用索引)
如idx_user_club(user_id,club_id),如果查询中有user_id的范围查询,则后面的club_id不会用到索引
因此对于这样的查询要麽避免范围查询,要麽将范围查询通过其它自定义的维护字段转换为等值查询
Explain时各个列含义
Type列
"index" 表示Mysql使用索引扫描来排序
Extra列
“Using Where” 表示Mysql服务器将存储引擎返回行以后再应用过滤条件
“Using index” 表示Mysql查询时使用到了覆盖索引
选择索引和编写利用索引的查询时,应注意:
单行访问是很慢的;
按顺序访问范围数据是很快的;
索引覆盖查询是很快的。
总结来说就是,编写查询语句时应该尽可能选择合适的索引以避免单行查找,尽可能地使用数据原生顺序从而避免额外的排序操作,
并尽可能的使用覆盖索引
1.在一个大表上快速创建索引
可以考虑先导出数据,删除然后新建表,最后再将以前的数据导入,这样比在原有大数据量表上直接建索引快速一些
2.复杂查询查看sql执行计划(explain)
3.尽量少使用not in,not exist,not null这样的查询
4.对于多列索引,尽可能避免范围查询(因为范围查询字段后面的字段无法使用索引)
如idx_user_club(user_id,club_id),如果查询中有user_id的范围查询,则后面的club_id不会用到索引
因此对于这样的查询要麽避免范围查询,要麽将范围查询通过其它自定义的维护字段转换为等值查询
Explain时各个列含义
Type列
"index" 表示Mysql使用索引扫描来排序
Extra列
“Using Where” 表示Mysql服务器将存储引擎返回行以后再应用过滤条件
“Using index” 表示Mysql查询时使用到了覆盖索引
选择索引和编写利用索引的查询时,应注意:
单行访问是很慢的;
按顺序访问范围数据是很快的;
索引覆盖查询是很快的。
总结来说就是,编写查询语句时应该尽可能选择合适的索引以避免单行查找,尽可能地使用数据原生顺序从而避免额外的排序操作,
并尽可能的使用覆盖索引