mysql优化

看书及博客总结的经验一直写再本子上,现在放到网上用于自己学习使用,如果你看到有问题话请及时跟我反馈。


sql的优化:

(大批量提交事务的时候)

1.插入数据,按照主键的顺序插入

2.关闭唯一性校验(unique-check)

3.手动提交事务(set autocommit = 0)

优化insert:

1.多条insert语句变成单条插入

2.事务提交变为手动提交

3.主键按照顺序插入(b+树)

优化order by

1.使用覆盖索引,2.按照索引的顺序,3.跟多个条件要么都是升序要么都是降序

优化group by:

group by会自动调用order by,如果不想排序,最后加上order by null

嵌套查询:采用多表联查的方式来替代子查询

优化or 

1.or最好不用复合索引(前后索引条件中必须都要符合最左前缀匹配)、

2.用union替换or

优化分页查询:

比如你写一个sql语句,select * from zhang where fan = ‘1’ limit (20000,1);会发现limit语句随着后面的数据随着数量的变大耗时变成,比如limit(20,10)的时间就会远小于limit(20000,1),因为limit会对前面的数据进行排序操作所以耗时,

解决方案:根据索引完成排序,然后根据主键关联查询数据;

1:例如:select * from tb t (select id from tbl order by id limit (2000,10)) a  where t.id = a.id 

2:还有中方法是只要找到相应的位置直接往后查询,例如:select * from tbl where id >20000 limit 10;  注:但是这种情况必须是主键自增列,并且不能出现断层的情况,如果出现断层的情况会出现查询数据不准确;

sql语句索引可以主动添加提示:

1.use index :例:select * from 。。。。。 use index () where name = ‘’;(建议数据库使用某种索引)

2.ingre index :与上面的情况相反

3.force index :强制数据库使用某种索引


应用程序的优化

1.使用数据库链接池,防止频繁的创建与关闭链接消耗资源

2.避免无效访问

3.使用缓存:如mybatis的的一二级缓存与redis的缓存

4.使用负载均衡的方式:使用读写分离的方式

master用于接收client的写请求,将数据同步给slave,客户端可以从slave进行数据读取但是不能写及更改数据

mysql进行数据处理的流程图:



mysql数据查询流程图


mysql并发参数调整

参数:max_connections(默认最大链接数)

back_log:挤压请求栈的大小,较短时间内处理很多请求,请求可以放到栈中

table_open_cache:表缓存

thread_cache_size:线程缓存大小,缓存一定数量的客户服务线程用以备用

innodb_lock_wait_timeout : innodb 事务行锁执行的等待时间,如果没有抢到锁直接返回,默认等待时间是50ms

mysql中的锁

分类:

{表锁:粒度大,并发低,不会死锁

行锁:开销大,粒度小,冲突小,会有死锁}

操作的分类:

{共享锁/排他锁}

mysiam(表锁):1.某一线程持有读锁会阻塞其他线程的写操作,不会影响读操作 || 2.持有写锁的时候,其他的写锁读锁都不能执行

    读写锁之间的调度是写锁优先,不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为 写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从 而可能永远阻塞。

innodb:(行锁):开销大,加锁慢,死锁

    一个概念行级锁升级为表级锁,当我们的索引失效的情况下如(索引是varchar类型但是索引条件没有加‘’),mysql会把整张表锁住,

    有一个间隙锁的概念,比如我们数据有1.2.3.4.6.7.8.9,没有5这条数据,然后我们查询语句是id<10.这个时候我们不commit ,然后我们对5进行操作,比如我insert into tb zhan  = fan  where id = 5;这个时候就会被卡住,这个就是间隙锁,innodb会自动对间隙进行加锁。

优化建议:

1.让所有的数据索引完成,避免无效的索引,导致行锁升级为表锁

2.合理设计索引,尽量缩小锁范围

3.尽量减少索引的条件,避免间隙锁的产生

4.控制事务的大小,减小锁定的资源量和时间长度

5.使用低级别的事务隔离(读未提交,读已提交,可重复读,串行读)

mysql日志:(待补充)

错误日志:show tables like “log_errors%”

二进制日志:ddl(数据定义语言) dml(数据操作语言)

                      日志格式:1.statement:sql语句用于主从复制,日志解析原文本,从库重新执行

                                         row:所有行数据变化

                                         mixed:默认格式

慢查询日志:

long_query_time :10s超过10s的数据语句

slow_query_log = 1 开启

slow_query_log_file = slow_query.log :慢日志的存储位置

mysql的主从复制



mysiam和innodb区别

innodb:事务 外键 行级锁 聚簇索引

mysiam:InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。
没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、MySQL优化 MySQL优化从哪些方面入手: (1)存储层(数据) 构建良好的数据结构。可以大大的提升我们S...
    宠辱不惊丶岁月静好阅读 7,319评论 1 8
  • SQL优化 -- 通过show status命令了解各种sql的执行效率 查看本session的sql执行效率sh...
    欢喜的看着书阅读 2,839评论 0 0
  • 备注:测试数据库版本为MySQL 8.0 一. 内部锁定方法 本节讨论内部锁定;也就是说,在MySQL服务器内部执...
    只是甲阅读 3,165评论 0 0
  • 原文链接:http://blog.csdn.net/qq_22329521/article/details/548...
    越长越圆阅读 11,415评论 0 22
  • 一、索引 1. 索引是什么? 定义索引是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构可...
    houxin阅读 4,044评论 0 7

友情链接更多精彩内容