Mysql高性能pdf阅读内容整理

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计算的消耗是不计算这些的
 
uploading.4e448015.gif转存失败重新上传取消
 
7. 如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新 利用未使用的空间,并整理数据文件的碎片。【当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。 在OPTIMIZE TABLE运行过程中,MySQL会锁定表
8. innodb的顺序主键问题:
uploading.4e448015.gif转存失败重新上传取消
innodb_autoinc_lock_mode 0,1,2
 
 
9.mysql  执行sql扫描数据:
   explain  查看mysql扫描了2w数据,实际上mysql真正扫描的数据比这个大,很多被where条件过滤掉了,
   select id,count(*) from  T where  。。 group by  id   
   这个语句可以用覆盖索引优化避免回表查询
 
10.重构查询方式:
 1. 大的sql可以考虑分开,比如delete 删除历史数据
  2.uploading.4e448015.gif转存失败重新上传取消
 
3.uploading.4e448015.gif转存失败重新上传取消
 
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.查询缓存问题查询:
发布了23 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq1076472549/article/details/104365547