一念花开~

导航

 

1:避免全表扫描
考虑在 where 和 order by 涉及的列上建立索引,in 和 not in 也要慎用,尽量用 between 取代。

2:优化 COUNT 查询
count 可以统计列的数量,统计列值时要求列非空;COUNT 还可以统计行数,当 MySQL 确定括号内的表达式不可能为 NULL 时,实际上就是在统计行数。当使用 COUNT(*) 时,会忽略所有列而直接统计行数。
某些业务场景不要求完全精确的 COUNT 值,此时可以使用近似值来代替,EXPLAIN 估算的行数就是一个不错的近似值。

3:避免子查询
在 MySQL5.5 及以下版本避免子查询,因为执行器会先执行外部的 SQL 再执行内部的 SQL,可以用关联查询代替。

4:禁止排序
当查询使用 GROUP BY 时,结果集默认会按照分组的字段进行排序,如果不关心顺序,可以使用 ORDER BY NULL 禁止排序。

5:优化分页
在偏移量非常大的时候,需要查询很多条数据再舍弃,代价非常高。最简单的优化是尽可能地使用覆盖索引扫描,而不是查询所有的列,然后做关联操作再返回所需的列。还有一种方法是从上一次取数据的位置开始扫描,避免使用 OFFSET。

6:优化 UNION
MySQL 通过创建并填充临时表的方式来执行 UNION 查询,除非确实需要消除重复的行,否则使用 UNION ALL,如果没有 ALL 关键字,MySQL 会给临时表加上 DISTINCT 选项,对整个临时表的数据做唯一性检查,代价非常高。

7:使用用户自定义变量
用户自定义变量是一个用来存储内容的临时容器,在连接 MySQL 的整个过程中都存在,可以在任何可以使用表达式的地方使用自定义变量,避免重复查询刚刚更新过的数据

 

=================

简述优化MySQL数据库的方法?

1、选取合适的字段属性
MySQL支持大数据的储存,但是一般来说,数据库中的表越小查询速度越快,所以在建表的时候尽量将表的宽度设小,另一个就是在尽可能的情况下把字段设置为NOTNULL

2、使用连接(JOIN)来代替子查询(Sub-Queries)
MySQL从4.1开始就支持SQL子查询,他可以使用SELECT语句来创建一个单列的查询结果,然后将这个结果作为过滤条件用在另一个查询中比如
SELRCT FROM ** WHERE *** NOT IN(SELECT *** FROM *)
如果使用连接(JOIN)来做查询回快很多尤其使查询字段中有索引的情况下

3、使用联合(UNION)来代替手动创建的临时表
MYSQL从4.0开始支持UNION查询,它可以把需要的使用临时表的select(两条及以上)的select查询合并到一个查询中。在客户端查询会话结束之后,临时表回会自动删除,使用UNION创建查寻时,只需要把UNION作为关键字将多个select语句连接起来(select中的字段数目要相同)
SELECT Name,Age FROM one UNION
SELECT Name,Phone FROM two UNION
SELECT Name,emile FROM three

4、事务
虽然我们可以使用子查询(Sub-Queries)、连接(JIOIN)联合(UNION)来来创建各种查寻,但并不是所有的数据库操作都是可以用一条或几条SQL语句就可以完成的,大多时候我们都需要一系列的语句来完成某种工作,当同时对两个关联表操作时可能会出现一条语句操作成功后,数据库库突然出现意外,第二个没有执行成功,这样就造成数据的不完整,甚至破坏数据中的数据,为了避免发生这种情况,我i们就应该使用事务,他的作用就是,要么全成功,要么全失败,可以保证数据库的一致性和完整性
事务是以BEGIN关键字开始,以COMMIT关键字结束,在这之间的的SQL操作只要一条失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。事务还有一个重要的作用就是当多用户同时操作相同的数据源时,它可以利用锁定数据库的方法来为客户提供安全访问方式,保证用户操作不被其他用户干扰。

5、锁定表
虽然事务是维护数据库完整性的一个好方法,但是它具有独占性,有时候会影响数据库的性能所以我们可以通过使用锁定表表来实现更好的性能,使用有WRITE关键字的sql语句可以保证在UNLPCKTABLES命令执行前,不会有其他的对该表的插入,更新删除操作
LOCK TABLE one WRITE SELECT Name FROM one WHERE Age=11;
...
UPDATE one SET Name ="王五" WHERE Age=16; UNLOCKTABLES

6、使用外键
锁定表方法可以维护数据的完整性,但是不能确保数据的关联性。这时候我们可以使用外键。

CREATE TABLE customerinfo ( CustomerIDINT NOT NULL, PRIMARYKEY ( CustomerID ) ) TYPE = INNODB;
CREATE TABLE salesinfo (
SalesIDNT NOT NULL,
CustomerIDINT NOT NULL,
PRIMARYKEY ( CustomerID, SalesID ),
FOREIGNKEY ( CustomerID ) REFERENCES customerinfo ( CustomerID ) ON DELETE CASCADE
) TYPE = INNODB;
注意一定要使用参数ON DELETE CASCADE保证数据的一致性,使用外键时在创建表的时候一定要将表的类型定义为事务安全表InnoDB类型。

7、使用索引
建立索引是提高数据库性能的常用方法,它可以使数据库比没有索引快的多的速度检索特定的行,尤其实在有序的情况下性能会更好。
建立索引的时候尽量建在将用于JOIN,WHERE和ORDERBY排序的字段上,尽量不要在含有大量重复的值的字段建立索引

8、优化查询语句
搜索字符型字段时减少使用LIKE关键字和通配符
尽量不要使用自动类型转换
不要在列上进行运算,
不使用NOT IN和<>操作

posted on 2023-10-31 14:17  一念花开~  阅读(18)  评论(0编辑  收藏  举报