mysql开启慢查询怎么把每天日志文件分开

log-slow-queries

首先,我们需要查看mysql server版本号,以及是否配置启用了slow query log。

mysql慢sql查询 mysql查看查询慢的语句mysql慢sql查询 mysql查看查询慢的语句


mysql慢sql查询 mysql查看查询慢的语句


#打开服务

log_slow_queries = ON

当log_slow_queries是ON时,才表示已经启用了记录slow query功能。默认是不记录slow query的。

启用slow query日志

#//将下列配置放到myf中

[mysqld]

log-slow-queries = /var/lib/mysql/slow-queries.log

//新增加的参数

long_query_time = 3

log-queries-not-using-indexes

log-slow-admincolumn-statements

上面的配置打开了slow query日志,将会捕获了执行时间超过了3秒的查询,包括执行速度较慢的管理命令(比如OPTIMEZE TABLE),并且记录了没有使用索引的查询。这些SQL,都会被记录到log-slow-queries指定的文件/var/lib/mysql/slow-queries.log文件中。

存放slow query日志的文件。你必须保证mysql server进程mysqld_safe进程用户对该文件有w权限。

long_query_time

如果query time超过了该值,则认为是较慢查询,并被记录下来。单位是秒,最小值是1,默认值是10秒。10秒对于大多数应用来讲,太长了。我们从3秒开始, 依次减少,每次都找出最”昂贵”的10条SQL语句并且优化他们。日复一日,一步一步优化。一次性找出很多条SQL语句,对于优化来讲,意义并不大。

log-queries-not-using-indexes

MySQL会将没有使用索引的查询记录到slow query日志中。无论它执行有多快,查询语句没有使用索引,都会被记录。有的时候,有些没有使用引索的查询非常快(例如扫描很小的表),但也有可能导致变慢,甚至还会使用大量的磁盘空间。

log-slow-admin-statements

一些管理指令,也会被记录。比如OPTIMEZE TABLE, ALTER TABLE等等。

阿里云慢sql明细执行完成时间是执行开始时间吗

是。查看阿里云数据服务公司,得知阿里云上的慢sql规则是执行时间大于等于1s则会记录,因此阿里云慢sql明获取到mysql当前使用的进程:细执行完成时间是执行开始时间。慢sql指的是mysql情况1:远程查询,其实可能查询不慢,由于数据量大,传输过程慢慢查询,是运行时间超过long_query_time值的sql。

php+mysql在数据库里数据大的话查询很慢

我们希望 MySQL 能先"缓存"子查询的结果(缓存这一步叫物化,MATERIALIZATION),但MySQL 认为不缓存更快,我们就需要给予 MySQL 一定指导。

1.建立索引,尽可能把索引建立到你你经常比较的字段上,如select

a,b,c,d

from

awhere

索引字段=值,这个索引字段是数值型数据

2.慢有更多情况,

情况2:WHERE

后面的比较数据太多,比如

like

类的语句

情况3:需要哪个字段只取那个字段就行了,比如select

from

a与select

b,c,d

from

a速度是有距的

问题补充:

.条:建立索引,怎么建立,我也听说过,但不知道怎么使用

答:每种数据建立索引的方法有异,比如SQL

SERVER

2000中可对多个字段进行索引。索引,比如SQL

SERVER2000中有命令

INDEX

为给定表或视图创建索引。

只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。

[UNIQUE

CLUSTERED

]INDEX

index_name

ON

{table

|view

[ASC

,...n

])

[WITH

>[

,...n]

ON

filegroup

]<

index_option

{PAD_INDEX

|FILLFACTOR

=fillfactor

|IGNORE__KEY

|DROP_EXISTING

|STATISTICS_NORECOMPUTE

|SORT_IN_TEMPDB

}第三条:数据库定期维护,压缩:怎么个压缩法?及时备份数据到备份库查询备份库,那查询时不是还慢吗?

答:这个有压缩工具,基本上每种数据库都有自己的压缩数据库的工具

mysql为什么千万级别查询比1000条数据的查询慢

在大数据量的时候这个多表查询尽量不用,毕竟是很耗内存的,宁愿用其他语言循环执行简单的 select 字段 from 表名 where 条件 这样的简单sql语句,这样也能加快速度。

这是自然规律使然。形象一点来讲,有人将各一枚硬分别丢进一碗水里和一口水塘里,然后您要将它们捞出来,哪个任务完成的快?当然是前者了,因为工作量没法比啊!

数据库查询道理也是一样的,数据越多从中检索出记录的速度越慢。你也许会说数据库不是有索引吗?咱不用从头到尾逐条检索呀。没错,当数据量达到百万以上的时候,你用主键去搜索某一条数据时速度是极快的。但当你不用主键去搜索的时候速度就降了几十倍甚至上百倍,这个是主键的好处。有索引数据库引擎可以直奔目标,检索少量数据的时候,1千条记录跟千万条记录比,从中检索出记录的耗时相无几,但是如果要检索出所有记录的话,两者的系统和时间开销可就不是一个数量级了,后者肯定慢得多。

跪求高手给出MySQL优化方案,7万多条查询很慢,查询代码如下,感激不尽

3.数据库定期维护,压缩,把不常用的数据备份后放入备份库里,查询时查备份库等

他用的是一个mysql的类,也就是说将mysql的作封装在一个类中。因为如果你直接使用php的函数来作数据库的话,可能会比较繁琐,而且不够直观,这样封装成类会比较直观。

其实你只需要了解如何调用以及这个类中的每个方法的用途和用法即可。

首先是这几句:

include 'mysql.php';//将mysql类包含进来,也就是下面的那一大堆

$server="localhost";//地址

$user="用户名";//mysql用户名

$psw="密码";//mysql密码

$database="数据库";//你要作的数据库

$db = new Mysql();//实例化Mysql类

$db->connect($server, $user, $psw, $database);//创建数据库连接,这已经开始使用mysql类的方法了

unset($server, $user, $psw, $database);//释放上面的变量,用意是减少系统开销

而至于下面说到的mysql类,你无需知道每一句都是什么意思,你只要知道那优化MySQL最重要的一部分工作是先确定”有问题”的查询语句。只有先找出这些查询较慢的sql查询(执行时间较长),我们才能进一步分析原因并且优化它。MySQL为我们提供了Slow Query Log记录功能,它能记录执行时间超过了特定时长的查询。分析Slow Query Log有助于帮我们找到”问题”查询。记录slow queries些方法怎么使用就行了。

比如query(),这个就是用来执行sql语句,比如:

$sql = "SELECT FROM table WHERE id=1";

$db->query($sql);

这样就会执行这条sql语句。

当然,这样的返回值是不直观的,如果想要简单地处理SELECT结果,可以使用fetchAll()、fetchOne()、fetchRow()、fetchArray()这些。顾名思义,fetchAll一般是返回二维数组,一般用于多行的查询结果。fetchOne一般是返回一维数组,一般用于单行的查询结果。其他的就需要你实际测试一下。

当然,还有update、delete这两个方法,这两个可以让你不用自己写sql语句,直接给相应的参数即可以做到更新或删除——因为sql语句也封装在这两个方法里面了。

其实这样的php的mysql类还有很多,比较好的一个是ezSQL,你可以去搞下来看看,使用起来很方便。

mysql order by 排序效率慢 SQL 附上

既然查询速度特别快 而且你也只需要如果是这样的话,你可以看看关于mysql的触发器的东西。排名前一百条的语句,可以用where语句再过滤一下,然后对查询出来的语句再进行排序。相对来说需要排序的数据量会少一些。

例如:

1、select top 100 from mytable order by operateDate;

2、select from (select top 100 from mytable ) a order by a.operateDate;

如果表内数据量比较大的话 ,2 的速度是优于1的。毕竟1是先对表内所有数据排序,然后再进行查询,2只需要排序过滤之后的][数据。

mySql为什么查询时有时快,有时慢

}(

主键约束。

当你的表字段设置有索引的时候,搜索速度比不创建索引要快几倍至几十倍。

sql语句不够优化。

在查询某数据的时候,能不用就尽量不用,想要哪个字段就查哪个,多余的不要,这样就能达到数据传输精简化,让查大多数情况下都是开发人员对sql的把握质量不够,导致慢sql查询的产生,进而影响数据库的整体运行状况。询速度也能快上许多。

多表联合查询。

美团面试题:慢SQL有遇到过吗?是怎么解决的?

|NONCLUSTERED

大家好,我是田维常,可以叫我老田,也可以叫我田哥

。2017年的时候,我刚去上海,朋友内推我去美团面试,之前我也写过一个一篇文章,也是在美团面试中遇到的:

美团面试题:String s = new String("111")会创建几个对象?

关于慢SQL,我和面试官扯了很久,面试官也是很谦虚的,总是点头,自己以为回答的还可以。的,还是说了“ 你先回去等通知吧! ”。

所以,我决定把这个慢SQL技术点,好好和你分享分享。希望你下次在遇到类似的面试,能顺顺利利轻轻松松的斩获自己想要的offer。

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录MySQL中查询时间超过(大于)设置阈值(long_query_time)的语句,记录到慢查询日志中。

其中,long_query_time的默认值是10,单位是秒,也就是说默认情况下,你的SQL查询时间超过10秒就算慢SQL了。

在MySQL中,慢SQL日志默认是未开启的,也就说就算出现了慢SQL,也不会告诉你的,如果需要知道哪些SQL是慢SQL,需要我们手动开启慢SQL日志的。

关于慢SQL是否开启,我们可以通过下面这个命令来查看:

在这里插入描述

通过命令,我们就可以看到slow_query_log项为OFF,说明我们的慢SQL日志并未开启。另外我们也可以看到我们慢SQL日志存放于哪个目录下和日志文件名。

下面我们来开启慢SQL日志,执行下面的命令:

这里需要注意,这里开启的是我们当前的数据库,并且,我们重启数据库后会失效的。

开启慢SQL日志后,再次查看:

slow_query_log项已经变成ON,说明开启成功。

上面说过慢SQL默认时间是10秒,我们通过下面的命令就可以看到我们慢SQL的默认时间:

在这里插入描述

我们总不能一直使用这个默认值,可能很多业务需要时间更短或更长,所以此时,我们就需要对默认时间进行修改,修改命令如下:

修改完了,我们再来看看是否已经改成了3秒。

这里需要注意:想要的生效,还需要修改MySQL下面的配置文件myf 文件。

Linux作系统中

Windows作系统中

执行一条慢SQL,因为我们前面已经设置好了慢SQL时间为3秒,所以,我们只要执行一条SQL时间超过3秒即可。

该SQL耗时4.024秒,下面我们就来查看慢SQL出现了多少条。

使用命令:

找到慢SQL日志文件,打开后就会出现类似下面这样的语句;

简单说明:

切记

通常我们定位慢SQL有两种方式:

第二种:根据不同的数据库使用不同的方式获取问题 SQL

如果开启了慢SQL日志后,可能会有大量的慢SQL日志产生,此时再用肉眼看,那是不太现实的,所以大佬们就给我搞了个工具: mysqldumpslow 。

mysqldumpslow 能将相同的慢SQL归类,并统计出相同的SQL执行的次数,每次执行耗时多久、总耗时,每次返回的行数、总行数,以及客户端连接信息等。

通过命令

可以看到相关参数的说明:

比较常用的参数有-- 打开sql 执行记录功能这么几个:

mysqldumpslow 常用的使用方式如下:

如上一条命令,应该是mysqldumpslow最简单的一种形式,其中-s参数是以什么方式排序的意思,c指代的是以总数从大到小的方式排序。-s的常用子参数有:c: 相同查询以查询条数和从大到小排序。t: 以查询总时间的方式从大到小排序。l: 以查询锁的总时间的方式从大到小排序。at: 以查询平均时间的方式从大到小排序。al: 以查询锁平均时间的方式从大到小排序。

同样的,还可以增加其他参数,实际使用的时候,按照自己的情况来。

其他常用方式:

接下,我们来个实际作。

这其中的 SQL 语句因为涉及某些信息,所以我都用号将主体替换了,如果希望得到具体的值,使用-a参数。

使用 mysqldumpslow 查询出来的摘要信息,包含了这些内容:

Count : 464 :表示慢查询日志总共记录到这条sql语句执行的次数;

Time=18.35s (8515s) :18.35s表示平均执行时间(-s at),8515s表示总的执行时间(-s t);

Lock=0.01s (3s) :与上面的Time相同,个表示平均锁定时间(-s al),括号内的表示总的锁定时间(-s l)(也有另一种说法,说是表示的等待锁释放的时间);

Rows=90884.0 (42170176) : 个值表示扫描的平均行数(-s ar),括号内的值表示扫描的总行数(-s r)。

是不是

so easy!!!!

如何查询mysql的执行记录

语法

set global log_output='TABLE'; -- 输出到表

|DESC

set global log=ON; -- 打开所有命令

执行记录功能general_log, 所有语句: 成功和未成功的.

set global log_slow_queries=ON; -- 打开慢查询 sql 记录

slow_log, 执行成功的: 慢查询语句和未使用索引的语句

set global long_query_time=0.1; -- 慢查询时间限制(秒)

set global log_queries_not_using_indexes=ON; -- 记录未使用索引的sql 语句

-- 查询sql 执行记录

select from mysql.slow_log order by 1; -- 执行成功的:慢查询语句,和未

使用索引的语句

select from mysql.general_log order by 1; -- 所有语句: 成功和未成功的.-- 关闭sql 执行记录