准备数据1.建表导入千万条数据表和数据地址(gitee)https://gitee.com/flowerAndJava/millions_data2。导入大批量数据a将数据库导入服务器(如果是windows系统,此步骤省略)b创建数据库创建数据库(db2),表tb_skuc命令行登录数据库mysql-u用户名-p密码;d切换到使用过的数据库usedb2;e使用命令loaddatalocalinfile'/tmp/tb_sku1.sql'intotable`tb_sku`fieldsterminatedby','linesterminatedby'\n';命令解释:'/tmp/tb_sku1.sql'数据目录(windows目录如:D:\life\tb_sku1.sql),将表导入到tb_sku。注意:我们使用了insert的sql向数据库导入数据,但是导入上千万条数据需要很长时间。2、慢查询分析(查找执行时间长的sql)2.1showprofilesshowprofiles是mysql提供的,可以用来分析当前会话中语句执行的资源消耗情况。可用于SQL调优测量。2.1.1设置MySQLsupportprofile1.查看是否支持select@@have_profiling,结果为YES,表示支持。2、查看profiling(profiling默认关闭)select@@profiling结果为0,表示未启用*fromtb_ksuwhereid<5;selectcount(*)fromtb_ksu;2.检查每条SQL的执行时间showprofiles;//如果执行没有反应,检查profiling是否开启,命令为select@@profiling;查看每条SQL的执行时间。3、查询每个阶段每条sql的执行时间selectprofileforquery6;//6,代表Query_ID上图说明了SendingdataMySQL线程开始访问数据行,并将结果返回给客户端,而不仅仅是客户端。Sendingdata状态下,MySQL线程经常进行大量的磁盘读操作,因此是查询中最耗时的状态。4、查看线程哪些资源消耗过多(typeall、cpu、blockio、context、switch、pagefaults)showprofilecpuforquery7;上图为2.2慢查询日志慢查询日志记录了所有执行次数超过参数(long_query_time)设置值的记录,并扫描所有记录不小于min_examined_row_limit的SQL日志。long_query_time默认为10秒,最小为0,精度可达微秒级。2.2.1设置慢查询日志1.修改配置文件(慢查询日志默认是关闭的)修改配置文件命令vi/etc/my.cnf在配置文件底部添加如下配置#This参数用于控制慢查询日志是否打开,可能值:1和0,1表示打开,0表示关闭slow_query_log=1#该参数用于指定慢查询日志的文件名slow_query_log_file=slow_query.log#该选项用于配置查询时间限制,超过该时间将被视为慢查询,并记录在日志中。默认值为10slong_query_time=102。重启mysql服务servicemysqldrestart注意如果执行命令后报如下错误,请使用命令systemctlrestartmysqld.service3。查看慢查询日志目录cd/var/lib/mysql2。2.2日志读取1.查询long_query_time的值showvariableslike'long%';2.执行查询操作select*fromtb_skuwhereid='100000030074'\G;select*fromtb_skuwherenamelike'%HuaWeiphoneMeta87384Pro%'\G;3.查询慢查询日志a使用catb如果慢查询日志很多,借助mysql自带的mysqldumpslow工具,进行分类汇总3讲解执行计划、索引使用和SQL优化(分析某条sql)通过通过以上步骤查询低效的SQL语句最后,可以使用EXPLAIN命令获取Mysql是如何执行Select语句的信息,包括表是如何连接的,以及Select语句执行过程中的连接顺序。3.1执行explain命令分析explainselect*fromtb_skuwhereid='100000030074';explainselect*fromtb_skuwherenamelike'%华为手机Meta87384Pro%';执行计划字段解释3.2字段值解释下。B、id的不同id值越大,优先级越高,越早执行。C.id可以相同也可以不同,同时存在。id相同的可以看作一个组,从上到下依次执行;在所有组中,id的值越大,优先级越高,越早执行。2.选择_type3。类型结果从好到坏NULL>system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALLsystem>const>eq_ref>ref>range>index>ALL4.keyA。possible_keys:显示可能应用到这张表的索引,一个或多个。B.key:实际使用的索引,如果为NULL,则不使用该索引。C.key_len:表示索引中使用的字节数。该值是索引字段的最大可能长度,而不是实际使用的长度。在不损失精度的前提下,长度越短越好。5.rows扫描的行数。6、filtered字段表示存储引擎返回的数据经过server层过滤后剩下满足查询的记录数的比例。
