2.【MYSQL】SQL优化

Mysql优化点

表的设计合理化(符合3NF)
添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]
分表技术(水平分割、垂直分割)
读写[写: update/delete/add]分离
存储过程 [模块化编程,可以提高速度]
对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]
mysql服务器硬件升级
定时的去清除不需要的数据,定时进行碎片整理(MyISAM)

数据表备份

create table B.test like A.test
insert into B.test select * from A.test
create table B.test as select * from A.test;

获取唯一行是限制

当查询是使用唯一主键查询;或者可以确定查询的结构只有一条记录时;可以在后面添加限制1的条件;这样可以在数据库引擎查询到一条记录后停止搜索整个表或索引
【用户名和密码进行登录】
#优化前
SELECT * FROM user WHERE username="chengxi" AND password="chengxi";
#优化后
SELECT * FROM user WHERE username="chengxi" AND password="chengxi" LIMIT 1;

充分利用索引查询

索引不只是主键或者唯一键,通常情况下,你可以将你的条件列设置为索引,当然,有时候还需要去了解那些类型的搜素不能够使用常规的索引
#优化前
SELECT * FROM tableName WHERE COL="col1";
#优化后
ALTER TABLE tableName ADD INDEX('COL');
SELECT * FROM tableName WHERE COL="col1";

SQL避免使用Select *

有几种情况: 
1.只需要几个列值而查询所有的话就会增加磁盘操作的空间 ;
2.如果我们在后续增加列,那么就会查询所有的数据,这样看起来没关系,但是如果在我们将返回的数据封装成一个自定义的entity实体类时就会发生报错了 
所以,总是在执行select查询时执行需要查询哪些列是一个好的习惯



## 定位执行速度慢的语句方法
### Mysql 配置参数查看:show status 
(比如想知道当前mysql运行的时间/一共执行了多少次select/update/delete.. / 当前连接)
```javascript
格式:show [session|global] status like ....
show status        				   ===>查询Mysql的所有参数
show status like ‘connections’;    ===>查询Mysql的连接数
show status like ‘uptime’ ;        ===>查询Mysql的连接时间
show stauts like ‘com_select’  ;   ===>查询select的次数
show stauts like ‘com_insert’  ;   ===>查询insert的次数
show stauts like ‘com_delete’ ;    ===>查询delete的次数
show stauts like ‘com_update’ ;    ===>查询update的次数

Mysql 慢查询配置修改

Mysql默认慢查询是:10S
>show variables like ‘long_query_time’ ; //可以显示当前慢查询时间
>set long_query_time=1 ;//可以修改慢查询时间

Mysql记录慢查询启动和配置

慢查询的sql记录到我们的一个日志中
在默认情况下,我们的mysql不会记录慢查询,需要在启动mysql时候,指定记录慢查询才可以
bin\mysqld.exe --safe-mode  --slow-query-log 
bin\mysqld.exe –log-slow-queries=d:/abc.log 

先关闭mysql,再启动, 如果启用了慢查询日志,默认这个文件放在my.ini 文件中记录的位置[datadir]配置中
#Path to the database root
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"

SQL语句的小技巧

  1. 在使用group by 分组查询是,默认分组后,还会排序,可能会降低速度.在group by 后面增加 order by null 就可以防止排序
  2. 有些情况可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。 select * from dept, emp where dept.deptno=emp.deptno; [简单处理方式]
    select * from dept left join emp on dept.deptno=emp.deptno; [左外连接,更ok!]
发布了58 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/dong8633950/article/details/83316305
今日推荐