|
件中装载一个表时,使用load data infile,这个通常比使用很多insert语句要快20倍。
插入的时候可以:insert into t1(name) values ("user1"),("user2"),("user3"),("user4"); --程序逻辑里面插入的时候尽量批量插入,要不插一次链接、关闭一次MySQL
五:优化group by语句:
如果查询包含group by但用户想要避免排序结果的损耗,则可以使用 order by null来禁止排序:
如下没有使用order by null来禁止排序
explain select id,sum(moneys) from table_Name group by id \G --默认是升序排序,desc sql 看下 Extra:using temporary:using filesort
如下使用order by null来禁止排序(作用:最低的消耗资源)
explain select id,sum(moneys) from table_Name group by id order by null\G --desc sql 看下 Extra:using temporary
六:优化嵌套查询(表都建立啦索引的前提下)
下面是采用嵌套查询的效果(可以使用更有效的链接查询(join)替代)
嵌套查询(效率极低,多表的话只会用到一张表的索引)
--里面的能用到索引外面的用不到索引
explain select * from table_Name1 where company_id not in(select id from table_Name2)\G --desc sql看下你会发现如果2张表都建立索引,你会发现改嵌套查询table_Name2会用到索引查询,table_Name1不会
替代(都使用到索引)
explain select * from table_Name1 left join table_Name2 on table_Name1.company_id=table_Name2.id where table_Name1.company_id is not null\G
链接查询优秀嵌套查询(上面):
desc select * t1.* from t1,t2 where t1.id=t2.uid \G --这个sql 2张表在查询的时候都会用到索引
左右链接查询也会同时用到索引:
desc select t1.* from t1 left join t2 on t1.id=t2.uid where t2.uid is not null \G
===============================================================================================================================
4.MySQL数据库优化(主要针对表)
一:优化表的类型
只能考认为的去对表结构进行优化
二:通过拆分提高表的访问效率
大存储量解决:1:分库分表 2:分区
主要目的:1:减少表的记录数 2:减少对操作系统的负担压力
三:使用中间表提高统计查询速度
中间表生成:1:view视图 2:重新生成一个新表
比如:有个存储帖子的表,能后我只是取前3条的热门贴,如果用select * from tiezi where id<4; 会全表扫描,性能低
1:就是建立视图(推荐使用视图)
create view zj_view as select * from tiezi where id<4; --查询的时候直接查视图表
2:就是建立个表(不灵活)
create table zj like tizi;
insert into zj select * from tiezi where id<4; --将数据插入到zj表,查询的时候查这个表即可
===============================================================================================================================
5.Myisam表锁
一:myisam读锁定(所有人只有读权限不能进行增删改)
1:lock table t1 read
2:开启另一个MySQL链接端,接着去尝试:select * from t1;
3: 再insert、update 和 delete t1这张表,你会发现所有的执行的sql都停留在终端上没有真正的去操作执行,直到解锁为止自动就执行
4:读锁定对我们在多备份大量数据时非常有用
mysqldump -uroot -p123456 test>test.sql
解锁:unlock tables;
二:myisam写锁定(只有本人进行增删改查,其他人不能进行任何操作)
1:lock table t1 write
2: 打开另一个mysql终端,尝试select、insert、update 、delete 这个表t1,你会发现都不能操作,
都会停留在终端上,只有等一个终端操作完毕,解锁后第二个终端才能真正执行
3:可见表的写锁比读锁更严格
4:一般情况下我们很少尝试的取对表进行read、write锁定的,myisam会自动进行锁定的
解锁:unlock tables; --全部解锁
===============================================================================================================================
6.MySQL服务器优化
一:四种字符集问题(尽量统一设置utf8)
sql: \s 查看
服务器字符集:server characterset: utf8
数据库字符集:Db characterset:utf8
客户端字符集:client characterset:utf8
链接字符集:conn. characterset:utf8
怎么设置字符集:mysql配置文件中找到:
[client]
default-character-set = utf8 --控制 客户端字符集 和 链接字符集
[mysqld]
character-set-server = utf8 --控制服务器的字符集和数据库字符集 以及继承下来的表字符集
collation-server = utf8_general_ci --控制校验字符集(用途:比如 order by来排序,数据库这么知道这么排序就是靠这个)
能后重启mysql: pkill mysqld --杀死进程
pstree |grep mysqld --看mysql进程还在不在
/mysql/bin/mysqld_safe --user=mysql & 重启
!ps --查看进程
查看校验字符集:
show character set; --一堆校验字符集
二:binary log 日志问题
查看bin log日志:
show variables like "%bin%"; --看log_bin 是否开启 ON表示开启,;inux默认是开启的
开启log-bin日志:
配置文件中打开:log-bin=mysql-bin
三:slow log 慢查询日志问题
查看慢查询是否开启:
show variables like "%slow%"; --看slow_query_log 是否开启
--慢查询日志保存地址 slow_query_log_file -> E:\wamp\bin\mysql\mysql5.5.20\data\asus-PC-slow.log
show variables like "%long%"; --查看慢查询时间10s,long_query_time
|