mysql 优化方案,纯干货

  1. 查询数据库的数据尽量使用索引来查询,避免全表扫描。尽量只查询索引条件的字段,例如,一张user用户数据表的id字段为索引,name为用户为非索引字段,当查询某条数据时,直接用id查询比用name查询效率会高很多。因为叶子节点存储id的值,这样不用回表查询,实现了索引覆盖。

  2. 从数据库中查询数据,sql语句尽量避免使用or来连接条件查询数据。因为使用or会导致执行sql的时候进行范围的索引扫描或则全表查询,效率降低。例如,SQL语句select id from user where name='a' or name='b',可以改为以下的形式来提高查询的效率:  select id from user where name='a'   union    select id from user where name='b' 

  3. 在连续数值的查询中,能使用between的情况下,尽量使用between,而不使用in。in和not in可能会导致全表查询。

  4. sql语句的where查询条件,对字段进行表达式操作,会导致mysql引擎放弃使用索引而进行全表扫描查询。例如 select *  from user  where  id/2=10

  5. sql语句的where查询条件,对字段进行函数操作,也会导致mysql引擎放弃使用索引而进行全表扫描查询。例如,下面语句查询name字段以abc开头的id,可以更改写法,提高查询的效率。  select  SUBSTR(name,2,3)  from `user`  where    SUBSTR(name,2,3)='me0'

  6. 多张数据表查询数据,使用inner join,left/right join来代替子查询。因为子查询需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。

  7.  select  * from `user`  a where  exists  (select `name` from `user`  b where a.id=19)  和    select  * from `user`  a where id  in  (select id from `user`  b where b.id=19) 。 in()适合B表比A表数据小的情况,exists()适合B表比A表数据大的情况

  8. 在使用like进行数据表的查询时,能用单%的情况下,不建议使用双%,双%查询会导致mysql引擎放弃使用索引而进行全表扫描查询,查询时尽量把%放后面,或则不适用%。

  9. 在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。左边匹配不到,整个sql不走索引。select * from `user` WHERE  u_one='1'  and   u_two='2'  

  10. 从数据库中查询数据时候,使用精确的类型匹配。比如  select id from user where id='3'  如果id建立的varchar类型的走索引,如果写成  select id from user where id=3 不走索引

  11. 选取最适用的字段属性 ,一般说来,数据库中的表越小,执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。

  12. 数据量比较大时,合理使用分区表。使用partition by 子句定义每个分区存放的数据。在执行查询的时候,优化器会根据分区定义过滤哪些没有我们需要数据的分区,这样查询就无需扫描所有分区,只需要查找包含需要数据的分区就可以了。

  13. 合理选择存储引擎。Innodb :适合数据完整性,并发性处理,擅长更新,删除。myisam:适合高速查询及插入。擅长插入和查询。

  14. 慢查询日志的使用,在调试的时候开启慢查询,定位的慢查询语句,再做优化策略。关闭/开启语句 Slow_query_log = 0|1   ,Long_query_time = N 超过该时间临界点,就为慢查询。

你可能感兴趣的:(mysql)