看书及博客总结的经验一直写再本子上,现在放到网上用于自己学习使用,如果你看到有问题话请及时跟我反馈。
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.使用负载均衡的方式:使用读写分离的方式

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必须扫描全表。