索引-性能分析-查看SQL执行频次以及慢查询日志

文章讲述了MySQL中索引的类型,包括唯一索引、全文索引和普通索引,以及如何创建和命名索引。强调了SQL性能分析的重要性,特别是对于SELECT语句的优化。通过SQL执行频率来确定数据库的优化策略,并介绍了慢查询日志的功能,它是识别低效SQL语句的关键工具,用于进一步的性能优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

索引语法

1、创建索引时候 [UNIQUE | FULLTEXT] 关键字是可选的;

1)加上 UNIUQE 就是创建唯一索引(唯一索引,说明改字段不能出现重复数据);

2)加上FULLTEXT 创建的是一个全文索引;

3)不加这两个参数,创建的就是一个常规索引;

2、最后 (index_col_name,...) 是在哪个列上创建索引;

其中 "(index_col_name,...)" 说明一个索引可以关联多个字段;

一个索引只关联一个字段,叫单列索引;一个索引关联多个字段叫组合索引又叫联合索引;

3、索引名命名最好是 idx_表名_字段名;例如 idx_user_name,user表name字段建索引;

SQL性能分析

 我们为什么要学习SQL性能分析?因为要对SQL做优化。主要对select语句做优化,其中索引优化占据了主导地位;

SQL执行频率

为什么需要使用SQL执行频率?

比如一个数据库的数据都是以增删改为主,那么我们没有必要对此数据库进行优化,或者优化程度可以放轻;通过SQL执行频率来确定,当前数据增删改查比例,从而确定对应优化方案,如果增删改为主,优化程度可以放轻。

如何查看SQL使用频率?

MySQL客户端连接成功后,通过 show[session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的 insert,update,delete,select 的访问频次:

注意:一个下划线 ‘_’ 就代表一个字符;这里一共是 7 个字符;

show global status like 'Com_______';  -- 查看当前会话的状态信息

如下图:查看当前数据库它的查询、它的插入、它的更新、他的删除次数是多少:

 慢查询日志

为什么要学习慢查询日志?

前面学习的查看SQL执行频率,只能知道哪种SQL执行频率比较高。我们现在需要对SQL进行优化,那么针对哪些SQL语句进行优化呢,此时我们就需要借助数据库的慢查询日志,来定位哪些SQL语句执行效率比较低,从而进行优化。

慢查询日志定义:

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。(执行时间超过10秒的SQL会被记录在慢查询日志中)(查看慢查询日志开关show variables like 'show_query_log'; )

MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

 注意:这个是Linux环境,日志所在位置;

修改慢查询日志配置-具体操作: 

1)通过mysql下的my.ini文件可以找到慢查询日志文件:
slow-query-log=1 //这个是慢查询日志开启,0表示关闭
slow_query_log_file=“MS-PHBDRPNRECXU-slow.log”//这个就是慢查询文件,位置在C:\ProgramData\MySQL\MySQL Server 5.6\data;
long_query_time=2 //这个是超过2秒的操作会记录下来。

2)通过mysql客户端查询一个200万行的表:
select count(*) from tb_sku;
3)这时候打开慢查询日志文件中就会记录下刚才的查询过程。

# Time: 221021 21:25:44
# User@Host: root[root] @ localhost [::1]  Id:     2
# Query_time: 3.017051  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 2000000
SET timestamp=1666358744;
select count(*) from tb_sku;

慢查询日志所在位置:

注意:可能根据版本不同,慢查询日志名不一样;我这边可能日志名不是 show_query_log

 

<think>好的,用户想查询当天SQL数据库的访问次数。我需要根据提供的引用内容来找到合适的方法。先看看引用里的例子。引用[1]中的第一个查询是统计近一年每月登录次数,使用了CONVERT函数来提取年月,然后按月份分组计数。这可能可以用来处理日期部分。不过用户需要的是当天的数据,所以需要调整日期条件。 引用[2]提到了使用窗口函数来统计累积访问次数,按用户和月份分组。但用户需要的是当天的总访问次数,可能需要按天分组,而不是月份。 引用[4]中的Oracle查询用到了v$segment_statistics表,统计逻辑读取次数来计算访问频次。不过这可能和实际的访问次数不同,因为逻辑读取是数据块的访问,不一定每次用户访问都会对应。另外,用户可能用的是SQL Server,因为引用[1]和[2]中的例子都是SQL Server和MySQL的语法,而引用[4]是Oracle的,所以需要考虑不同数据库系统的语法差异。 用户的问题没有明确说明使用的是哪种数据库系统,所以可能需要提供多种数据库的解决方案。比如SQL Server、MySQL和Oracle的不同方法。 首先,对于SQL Server,引用[1]中的查询使用了OPLOG表,其中OpDate是操作时间,OpCata是操作类别。可以修改这个查询,将日期条件改为当天。比如,WHERE OpDate >= CONVERT(date, GETDATE()) AND OpDate < DATEADD(day, 1, CONVERT(date, GETDATE())),这样可以获取当天的记录,然后统计次数。 另外,如果数据库有审计日志表,可能需要查看具体的表结构。假设存在记录每次访问的表,比如访问日志表,包含访问时间字段,那就可以用COUNT(*)来统计当天的记录数。 对于MySQL,可能需要使用CURDATE()函数来获取当天的日期,比如WHERE visit_date >= CURDATE(),然后按用户或直接统计总数。 Oracle的话,引用[4]中的方法可能不太直接,因为它是计算逻辑读取的次数,而不是实际的访问次数。如果Oracle有审计表,可能需要查询相应的审计日志,比如DBA_AUDIT_TRAIL,但需要确保审计功能已启用。 还需要考虑性能问题,比如是否有索引在OpDate字段上,如果没有,查询可能会慢。另外,如果当天的数据量很大,COUNT(1)可能需要较长时间。 总结一下,需要根据不同的数据库系统提供不同的查询方法,并建议用户确认审计日志是否存在,或者是否有记录访问次数的表。同时提醒用户权限问题,比如是否需要特定的权限来访问系统表或审计日志。</think>根据不同的数据库类型和表结构设计,提供以下几种查询当日数据库访问次数的方法: ### 一、SQL Server实现方案 假设存在记录访问日志的表`OPLOG`(参考引用[1]): ```sql SELECT COUNT(1) AS 当日访问次数 FROM OPLOG WHERE OpCata = '用户登录' -- 根据实际字段值调整 AND OpDate >= CAST(GETDATE() AS DATE) -- 当天起始时间 AND OpDate < DATEADD(DAY, 1, CAST(GETDATE() AS DATE)) -- 次日零时 ``` ### 二、MySQL实现方案 若存在访问记录表`access_log`(参考引用[2]): ```sql SELECT COUNT(user_id) AS daily_visits FROM access_log WHERE DATE(access_time) = CURDATE() ``` ### 三、Oracle实现方案 通过动态性能视图(参考引用[4]): ```sql SELECT COUNT(*) AS 当日访问量 FROM DBA_AUDIT_TRAIL -- 需启用审计功能 WHERE TRUNC(EXTENDED_TIMESTAMP) = TRUNC(SYSDATE) AND ACTION_NAME = 'LOGON' -- 登录动作 ``` ### 四、通用性能监控方案 通过系统监控指标(参考引用[3]): ```sql -- SQL Server查看当前连接数(间接反映访问量) SELECT DB_NAME(dbid) AS DatabaseName, COUNT(dbid) AS Connections FROM sys.sysprocesses WHERE dbid > 0 AND login_time >= CAST(GETDATE() AS DATE) GROUP BY dbid ``` **注意事项:** 1. 需要`SELECT`权限和审计功能支持[^1][^4] 2. 精确统计需提前配置访问日志记录[^2] 3. 监控指标反映的是资源使用情况而非精确次数[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值