对mysql数据库表频繁添加删除修改导致数据库卡,怎么优化?
不要用delete,可以尝试用下列办法 drop table tblname; -- 彻底删除该表 truncate table tblname; -- 快速删除数据,但是保存数据结构
mysqlhash分区优化原理?
MySQL的哈希分区优化原理是将数据按照哈希算法进行分区,将相同哈希值的数据放到同一个分区中。这样做可以减轻单个分区的压力,提高查询速度和负载均衡。
同时,哈希分区可以根据实际情况进行调整,比如增加或减少分区,优化数据分配,更好地利用硬件资源,提高系统性能。
mysql优化教程?
1、对SQL语句、索引、表结构等进行优化。
2、开启查询缓存,Query Cache缓存了SELECT查询及其结果数据集,当执行一个同样的SELECT查询时,MySQL会从内存中直接取出结果,加快了查询执行速度、减小了数据库的压力。执行SHOW VARIABLES LIKE 'have_query_cache';可以查看MySQL查询缓存是否打开,开启查询缓存只需配置my.cnf文件即可,具体如下:
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 1M
保存好后重启MySQL。
3、选用InnoDB存储引擎,MySQL常用存储引擎是MyISAM和InnoDB,二者区别如下:
MyISAM
查询速度快;
支持表级锁,在上锁期间表上不能进行其他操作;
支持全文检索;
支持数据压缩、自我复制、查询缓存、数据加密;
不支持外键;
不支持事务,所以也就没有COMMIT和ROLLBACK操作;
不支持集群数据库。
InnoDB
支持行级锁;
支持外键,对外键约束强制;
支持事务,可执行COMMIT和ROLLBACK操作;
支持数据压缩、自我复制、查询缓存、数据加密;
可用在集群环境,但并不完全支持。InnoDB表可以转换为NDB存储引擎,这样就能用在集群环境。
MySQL的优化要根据实际业务,并没有什么通用的优化。
其实其他回答都说的很全,
但是我从比较实际的地方说说吧。
第一、开启MySQL的slowLog
slowLog会记录MySQL执行过的慢查询,比较佛系的办法就是让它记录一段时间,
然后查看里面执行的语句。
第二、通过desc的方式来查看慢的原因
比如:SELECT * FROM tbl WHERE Date = CURDATE();
你可以通过执行 desc SELECT * FROM tbl WHERE Date = CURDATE();
这个时候Mysql就会显示执行这句sql的计划,
如果你发现是全表查询,这个时候尝试在Date上增加索引,
然后再跑一次DESC,这个时候你就会发现这句语句已经走了索引。
*通常这个办法能解决90%的慢查询问题。
当上面的问题都无法满足到你的时候,
建议可以参考Mysql官方的参数设定,
然后根据业务特性对MySQL进行特定优化。
答: 本文邀请ryangz分享近来项目的mysql优化经验~
准备知识
了解select的执行顺序有助于理解语句的结果并对其进行优化,执行顺序如下:
可以通过show status like 'XXX', show global status like 'XXX',show variables like 'XXX' 查看很多重要的数据,eg:Connections 连接数,Slow_queries 慢查询(可以用 show variables like ‘%slow%’来查询是否开启慢查询日志)等等。
可以通过 desc sql命令 (同样可是使用explain命令,用法相同)获取这个查询的各种属性,检查这个语句是否达到性能标准。着重看重点要看这几列:
rows(影响行数)
select_type(查询类型,是单表查询还是多表查询)
type、possible_key和key(可能用到的索引,以及真正用到索引等)
[ possible_key说明可能用到索引competition_id,但是key为null表明最终没有使用索引,进行了全表扫描,rows为全表数量 ]
[ 本次查询是嵌套查询,两张表的主键都是id,通过desc命令可以看出,player_unique_id的查询时使用的主键索引,影响条数rows为1,但是外部查询虽然id是主键但是没有使用索引,进行了全表查询 ]
一些小技巧和注意事项:
(1)有些时候即便你加了索引,数据库查询的时候也不会使用:
like的%如果只有一个,并且放在开头,则不会使用索引;eg ‘%user’不会使用索引,但是’user%’,’%user%’都会使用索引;
查询的时候and和or 如果想使用索引的话需要前后都加索引,如果只有一个则不会使用索引;
如果查询的时候该列是varchar,但是写的时候没有带引号(写成2018,而不是’2018’),则不会使用索引;
反向条件查询不能使用索引,尽量少用 !=,not in,not exists;
复合索引最左前缀,eg: 复合索引(name`, age):
select * from XXX where age=? and name=? 使用索引
select * from XXX where name=? 使用索引
select from XXX where age=? *不使用索引
(2)尽量避免用嵌套查询,外层的就算是主键也不会使用索引(可以参看准备知识中的例子),可以使用左连接、右连接或者相同的功能的其他写法代替。
(3)如果明确知道只有一条结果返回,limit 1能够提高效率
(4)所有不清楚的操作可以通过?查询,类似linux的man操作,? view 就可以查询视图基本语法
(5)开始数据库慢日志:
vim /etc/my.cnf 添加log_slow_queries=slow.log 以及long_query_time=5(设置慢日志的时长), 然后重启mysql
综上,一般的查询优化步骤如下:
(1)查看慢查询日志,或者通过show status命令查看数据库各项指标是否正常,其中 show status like ‘%handler_read%’ 中 Handler_read_rnd_next如果很高的话,说明需要检查索引了,看看是索引加的不对还是用法不对。
(2)找到问题的语句,通过desc定位这个语句到底哪里有问题,是语句写法问题、索引问题、还是表结构问题等等。
(3)优化语句,重复第1步,直到符合业务需求