简单介绍一下mysql,它是一个我们编码过程中储存数据的工具,没错我的认知它就是一个工具而已,只不过这个工具在我们慢慢使用过程中随着数据的不断的增多,我们发现它有些sql执行速度开始跟不上了,在硬件条件不变的情况下我们想让这个工具发挥的更好,帮我们处理更大的数据场景,那么我们就需要更加清楚的去了解它,去了解它的一些简单原理,基于这些原理去掌握能使得它相对更短时间处理更大查询数据的能力,于是你发你能够mysql优化查询了,啰嗦一句,编码过程中我们会用到很多很多工具,哪有那么多时间去了解工具详情啊,但我们可以快速去了解这个工具能做哪些事情,不能做哪些,瓶颈在哪,如果优化避免,大体宏观去把握,再到细致去实践运用。
假设场景:App随着时间推移数据不断变多,有些api反映速度开始变得很慢 ,并且我们已经定位到api变慢的原因就是mysql查询,好!开始开展步骤了。
1.我们可以查询项目运行日志,找到你对应的api,去追踪这个api执行了哪些sql,各个sql执行时间,当然前提是你的项目开启sql日志记录行为,并且这是从优化api的角度出发的,还有一种方式,就是从你的mysql这个工具出发,mysql有个慢查询配置设置,通过它我们可以抓取mysql所有执行超过1秒(自定义时间)的sql,这样我们就以mysql为单位抓取到了mysql平台上所有超过1秒时间的sql集中消化处理。至于慢查询如何配置使用参考:https://blog.csdn.net/m_nanle_xiaobudiu/article/details/79288257
最后记得用explain去执行你的sql,根据type count等参数去检验你的sql效率。
2. 通过1我们获取了所有慢查询的sql,怎么样让它查询变快?索引来解决,那么什么是索引,索引有哪几种类型,怎么为表字段建立索引需要我们自己去了解,这里说一下创建索引:
1.添加PRIMARY KEY(主键索引):mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引):mysql>ALTER TABLE `table_name` ADD UNIQUE (`column`)
3.添加INDEX(普通索引):mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引):mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引:mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
6.前缀索引:mysql>ALTER TABLE `test`.`english_translate_relavance` ADD INDEX `db_name_index`(`db_name`(10),`table_name`)) USING BTREE COMMENT '索引备注信息:为test数据库下的english_translate_relavance表的db_name字段和table_name字段建立联合索引,db_name为前缀为10,table_name则整个字段长度都在索引中,1-5添加单列索引,6故意设置个混合联合索引';
3. 否管我们建立的索引是否起作用的,是的索引是否起作用,起多大作用是有它的一套标准的,什么最左原则啊,一般什么字段去建立索引啊(where,join),遇到啥索引就会失效啊(null,or,函数,>,<,like...),联合索引与多列索引的区别啊,大表建索引小表不建立索引啊,什么索引的字段长度设计啊(结合计算机内存空间)等等去了解下呗,反正就是把我它怎么用起作用,怎么用作用明显,怎么用资源占用少。。百度一堆,懒人推荐:https://www.cnblogs.com/chenhaoyu/p/8761305.html
4. 索引的直接代价它会暂用资源,它是用来帮我快速找到我们需要的数据,可见我们最终要的是数据不是它,所以它的存在暂用的资源越少越好,并且它需要维护,每一次我们的table中update,insert,delete行为都要去维护它,速度会变慢,要知道u,i,d本身就会带来各种锁问题,最终各种等待就来了,服务器压力就接踵而至了,所有注意好场景也很重要,大不了就主从呗。
更多好文章:
mysql并发场景-锁:
事物隔离:https://www.cnblogs.com/protected/p/6526857.html ,四种隔离级别好好看看,每看一遍或许你都有不同的领悟。