sql优化

建表需要注意的:能用int的不要用varchar,如果非负的话用UNSIGNED int,Ip地址用int存(使用inet_aton函数转换)

建索引要考虑的:多表查询优先考虑建在on连接条件上(注意on的两边字段类型是否一样,编码格式是否一样),单表查询建在where条件,
建复合索引还是单列索引,复合索引虽然效率高但是如果查询条件不满足左前缀原则会不生效

使用复合索引如果有范围查询,尽量带上=等于号.

使用索引覆盖可以避免回表查询,速度更快,如果条件满足尽量使用索引覆盖.
索引用没用,用的哪个索引,如果默认索引不合适,手动指定索引; use index(建议用哪个索引), ignore index(指定忽略的索引), forece index (强制指定索引)

update语句更新数据时where条件如果用了索引就是行锁,如果没没索引就是表锁,尽量用行锁更新数据(update/delete的where条件都用主键,可以先查出主键再执行更新删除操作)

in 和exist:in需要对子表全表扫描,exist是把外面数据一条条带进来,子表数据量大时往往exist快
子查询和join,子查询就是where条件里某个字段in(select xxx),in改成关联查询时要注意可能出现主表一条数据关联出子表多条数据的情况,这种问题在in中不会出现。
多字段用like模糊查询时用union组合每个查询条件,而不是用or连接多个like模糊查询
多表关联可以拉宽表但是实时性不高,total慢可以换myisam引擎或者跑常量表。

深度分页查询慢时可以先用id>xxx后跳过前面部分数据再用limit分页,弊端是这样不能直接跳转到第n页,只能根据上一条数据的id往后查,并且id要自增,uuid不能用。

索引失效情况: 

1 索引列上有函数,比如substring截取

2 存储数字格式的字符串类型列上不加''单引号,因为字符串类型不加单引号存在隐士类型转换

3 like模糊查询前面加%

一般情况下一张表只会用一个索引,如果存在or,union这种可能会用到多个索引, 执行计划的type显示Index Merge.

 开启慢查询日志:  在mysql配置文件(/etc/my.cnf)中配置 : show_query_log=1(开启慢查询功能), long_query_log=2(设置超过2秒为慢查询,时间可以根据需要改)
慢查询日志文件在/var/lib/mysql/localhost-slow.log
 
 
 
 
 
 
posted @ 2024-07-27 19:02  杨吃羊  阅读(6)  评论(0)    收藏  举报