1.innodb解决死锁:死锁检测,死锁超时,将持有最少行级锁的事务回滚
2.数据库死锁产生的原因:1.数据冲突,
2存储引擎的实现方式导致的?
3.数据类型:
整型尽量使用小的int类型;建议不要null ;
财务数据精度可以*1000存为bigInt型;因为decimalmysql处理效率低;
定长字符串使用char比如md5加密,短的字符串,更新较多的;
varchar适合数据更新少,不定大小;utf-8的字符集存储等 ;
varchar(10) 比varchar(20)好,前提是满足字符串要求;
blob和text的区别:blob存储的是二进制数据,text存储的是字符集可以排序,不过只能排序max_sort_length长度,如果需要排序可以 使 用 order by sustring(column,length);
myisam不支持使用blob和text,强行使用会存到磁盘临时表效率低,另外useing temporary说明这个查询使用了隐士临时表
timeStamp 比dateTime效率更高
4,alert table优化:新建一张表然后切换,如果只是修改默认值等可以直接修改.frm 文件:
alter table bb_business_source_temp alter column source_id set DEFAULT '1';
5.索引:
索引的最左前缀原则:select * from u where u.id =? and u.name like 'l%' and u.age =? 只能使用id ,name 两个字段的索引
hash索引:根据列的值计算hash值组成的索引,相同的hash值存链表,所以查找快,但是因为是根据hash来索引不支持排序,对于组 合 索引(a,b) 不能单独使用a,只能a,b全部使用,不支持范围查询比如pice>1000,支持= in ()
6.索引的选择:
出现 mysql自动的索引合并策略说明索引建的垃圾,因为会消耗cpu和算法,返回更多的列,实际explain计算的消耗是不计算这些的
转存失败重新上传取消
7.
如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新
利用未使用的空间,并整理数据文件的碎片。【当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。
在OPTIMIZE TABLE运行过程中,MySQL会锁定表
8. innodb的顺序主键问题:
转存失败重新上传取消
innodb_autoinc_lock_mode 0,1,2
lock_mode 参数详解: https://blog.csdn.net/cug_jiang126com/article/details/52987587
覆盖索引的应用:延迟关联: https://www.cnblogs.com/wang-meng/p/ae6d1c4a7b553e9a5c8f46b67fb3e3aa.html
9.mysql 执行sql扫描数据:
explain 查看mysql扫描了2w数据,实际上mysql真正扫描的数据比这个大,很多被where条件过滤掉了,
select id,count(*) from T where 。。 group by id
这个语句可以用覆盖索引优化避免回表查询
10.重构查询方式:
1. 大的sql可以考虑分开,比如delete 删除历史数据
2.转存失败重新上传取消
3.转存失败重新上传取消
11.mysql能处理的优化类型:
1.重新定义关联表的关联顺序
2.将外连接(左右链接)转换为内连接(inner Join)
3.覆盖索引扫描:如果查询返回的列如果索引都包含了直接走索引不走磁盘
4.优化min,count,max:比如查询最小的值直接返回索引的最左侧的值
5.in() mysql会把in中的值排序,然后用二分搜索法搜索符合的值,O(logn),而or时间复杂度是O(n)
12当mysql不能通过索引顺序来排序的时候,就会使用内存或磁盘来排序都是filesort
mysql排序算法有两种:
1(旧)先取需要排序的字段排序一次Io,排序完后再获取其他的字段两次IO
2(新)直接取出来所有的数据,然后排序,减少了IO,但是如果查询的数据多会占用大量的空间
两种算法都有他的优缺点,可以通过mysql的参数max_legtn_for_sort_data来动态切换
mysql 关联查询的排序:
如果只用第一个表的字段来排序,那么mysql再处理第一个表的时候就会进行
文件排序,explain时只有using fileSort. 其他情况都会是
using fileSort . using temporary
13
explain EXTENDED ;
show WARNINGS; 可以查看sql被优化过后是怎么执行的
14. mysql查询缓存:
1. mysql通过计算查询语句的hash值来判断,sql如果包含任何的不确定条件或者函数查询缓存都不生效,
2. 查询缓存会跟踪语句涉及的每张表,如果表被更新相应的查询缓存也不生效
3.对于inndo引擎来说,如果一个事务修改了一张表,会将相关的表的查询缓存失效,又因为inndo的数据多版本问题导致这个事务的修改对其他用户来说是不可见的,
此时所有的其他关联这个表的查询缓存都失效了。所以长时间运行的事务会大大降低查询缓存的命中率
4.查询缓存问题查询: