一、优化语句查询test表中数据有500w字段有id/t_id/type_id/plat_id语句为select max(t_id) from test where type_id1 and plat_id1考察mysql语句优化这里主要是优化max函数max函数会导致全表扫描效率会很低可以使用order by加limit进行优化selectt_idfromtestwheretype_id1andplat_id1orderbyt_iddesclimit1;还可以使用加索引进一步优化速度给t_id加索引还有(type_id/plat_id)联合索引。二、写条语句从user 表随机调取 1 条数据select * from user order by rand() limit 1;使用 RAND() 函数对结果集进行随机排序。三、如何排查和优化查询比较慢的sql语句使用MySQL 的慢查询日志通过explain 可以查看一条SQL使用哪些索引和有什么使用临时表关注以下字段type访问类型如 ALL、index、range 等。key使用的索引名称。rows估计的行数。Extra其他信息如是否使用了临时表、文件排序等。优化查询语句本身和添加索引仅选择需要的字段避免使用 SELECT *。确保 WHERE 条件中使用了索引列。避免在索引列上使用函数或运算符这会阻止索引的使用。根据查询的 WHERE 条件和连接条件添加索引。过多或不必要的索引会增加写操作的开销影响性能。对于不经常变化且查询频繁的数据可以考虑使用缓存如 Memcached、Redis 等。四、mysql数据库索引有哪些什么情况下不适合建立索引主键索引Primary Key主键索引是唯一标识每条记录的索引确保表中每行数据都有唯一的标识。一个表只能有一个主键索引通常是在主键字段上创建的。唯一索引Unique Index唯一索引确保索引列中的所有值都是唯一的但允许存在空值NULL。一个表可以有多个唯一索引可以用来确保列或组合列的唯一性。普通索引Normal Index普通索引是最基本的索引类型用于加快对列的查询速度。可以对表中的任意列创建普通索引。全文索引Full-Text Index全文索引用于在文本数据中进行全文搜索例如文章内容或文档。可以对 CHAR、VARCHAR 或 TEXT 类型的列创建全文索引。组合索引Composite Index组合索引是包含多个列的索引用于加快联合条件的查询。查询时可以利用索引覆盖多个查询条件。空间索引Spatial Index空间索引用于优化空间数据类型的查询例如地理位置信息。可以用于 GEOMETRY、POINT、LINESTRING 等空间数据类型的列。对于经常用作 WHERE 子句中的查询条件、ORDER BY 进行排序、JOIN 操作中连接的列通过索引可以加快连接操作的速度。不适合建立索引的情况低基数的列基数Cardinality指的是列中不同值的数量。如果列中的值几乎全部相同建立索引的效果会很小。频繁更新的列对于频繁更新的列特别是使用 UPDATE 和 DELETE 操作的列索引可能会增加维护成本并且在插入新记录时可能会影响性能。小表对于行数很少的表查询速度本身已经很快额外的索引可能不会带来显著的性能提升反而增加了存储和维护成本。不会用到的列如果某列很少用作查询条件或者几乎不会出现在 WHERE 子句中建立索引可能没有意义。文本/图像类型的列对于 TEXT、BLOB 等大字段类型通常不适合建立索引可以考虑使用全文索引或者其他技术来优化查询。五、缓存穿透、缓存雪崩、缓存击穿的区别以及对应的解决方案缓存穿透Cache Penetration问题描述缓存穿透指的是恶意或非法访问请求查询一个不存在的缓存数据导致该查询请求绕过缓存直接访问数据库从而引起数据库的压力增大。解决方案缓存空对象Cache Null Object对于不存在的数据也将其缓存起来设置一个较短的过期时间防止恶意请求多次访问。缓存雪崩Cache Avalanche问题描述缓存雪崩指的是缓存中大量的缓存数据同时过期失效导致大量的请求直接访问数据库从而造成数据库压力剧增甚至引发系统崩溃。解决方案缓存失效时间随机化设置缓存的失效时间随机分布避免大量缓存同时过期。分布式锁在缓存失效时使用分布式锁控制同时只有一个请求更新缓存避免缓存失效时大量请求同时更新。热点数据永不过期对于重要的热点数据设置永不过期保证即使其他数据失效也不影响重要数据的访问。缓存击穿Cache Miss问题描述缓存击穿是指某个热点数据过期或被删除在数据未来得及被缓存之前大量请求直接打到数据库上引起数据库宕机解决方案设置热点数据永不过期对于热点数据采用永不过期的方式确保即使缓存失效也能保持访问的稳定性。互斥锁Mutex Lock在缓存失效时使用互斥锁控制只有一个请求能够更新缓存其他请求等待更新完成后再获取数据。预先加载Preloading提前加载热点数据到缓存中确保即使缓存失效时也能快速从缓存中获取数据。六、安全对一套程序来说至关重要请说说在开发中应该注意哪些安全机制使用验证码防止注册机灌水使用预处理绑定参数参数过滤转义防止sql注入使用token防止远程提交使用token验证登录状态七、Innodb下创建表表中不创建主键索引创建一般索引后查询逻辑是怎样隐式主键的创建如果你在创建表时没有定义主键索引InnoDB会自动创建一个6字节的ROWID作为隐式主键。这是为了保证每一行有一个唯一标识符。查询逻辑当你对这个表执行查询时查询逻辑会根据查询条件来决定使用什么索引。如果你的查询条件包含了索引列例如name列InnoDB会使用一般索引来加速查询。查询流程如下查找索引首先InnoDB会在idx_name索引中查找符合条件的索引项。获取ROWID通过索引项找到对应的ROWID隐式主键。查找数据使用ROWID在聚簇索引B树中找到实际的数据行。八、有两个文件大小都超过了 1G一行一条数据每行数据不超过 500 字节两文件中有一部分内容是完全相同的请写代码找到相同的行并写到新文件中。PHP 最大允许内存为 255M解题思路由于文件较大需要注意内存的使用可以将第一个文件逐行读取转换为MD5值存入数组。第二个文件也逐行读取转换为MD5并判断每个MD5是否存在于刚才的数组中。九、请用 SHELL 统计 5 分钟内nginx 日志里访问最多的 URL 地址对应的 IP 是哪些#!/bin/bash# 设置时间范围start_time$(date-d5 minutes ago%d/%b/%Y:%H:%M:%S)end_time$(date%d/%b/%Y:%H:%M:%S)# 统计访问最多的URL地址和对应的IP地址awk-v start_time$start_time-v end_time$end_time$4 [start_time $4 [end_time {print $1,$7}access.log|sort|uniq-c|sort-rn|head-10start_time 和 end_time 分别表示统计的时间范围这里设置为5分钟前至当前时间awk 命令用于从日志文件中提取时间、IP地址和URL地址。其中4表示日志中的时间字段4表示日志中的时间字段4表示日志中的时间字段1 表示日志中的IP地址字段$7 表示日志中的URL地址字段。sort 命令用于将提取出来的IP地址和URL地址进行排序uniq -c 命令用于统计每个IP地址和URL地址的出现次数sort -rn 命令用于将统计结果按照出现次数从大到小排序head -10 命令用于只显示出现次数最多的前10个IP地址和URL地址十、写一段 shell 脚本实现备份 mysql 指定库如 test) 到指定文件夹并打包并删除 30 天前的备份然后将新的备份推送到远端服务器完成后送邮件通知#!/bin/bash# 备份文件名BACKUP_NAMEtest_$(date%Y%m%d_%H%M%S).sql# 备份目录BACKUP_DIR/path/to/backups# 本地备份文件路径BACKUP_FILE$BACKUP_DIR/$BACKUP_NAME# 远端服务器信息REMOTE_USERuserREMOTE_HOSTremote_hostREMOTE_DIR/path/to/remote/dir# 邮件信息MAIL_TOuserexample.comMAIL_SUBJECTMySQL Backup ReportMAIL_BODYMySQL backup completed successfully.# 备份 MySQL 数据库mysqldump-u root-pPASSWORD test $BACKUP_FILE# 压缩备份文件tar-czvf$BACKUP_FILE.tar.gz$BACKUP_FILE# 删除 30 天前的备份文件find$BACKUP_DIR-typef-name*.tar.gz-mtime30-delete# 推送备份文件到远端服务器scp$BACKUP_FILE.tar.gz$REMOTE_USER$REMOTE_HOST:$REMOTE_DIR# 发送邮件通知echo$MAIL_BODY|mail-s$MAIL_SUBJECT$MAIL_TO十一、有 10 亿条订单数据属于 1000 个司机的请取出订单量前 20 的司机SELECTdriver_id,COUNT(*)ascountFROMorderGROUPBYdriver_idORDERBYcountdesclimit20十二、如何以最少流量消耗获取一个远程资源(假设1G)的最后10个字节可以使用cURL库并设置Range头部。$urlhttp://example.com/resource;$chcurl_init($url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_HTTPHEADER,array(Range: bytes-10));$responsecurl_exec($ch);curl_close($ch);echo$response;十三、跨域请求时如何解决跨域请求Cross-Origin Requests指的是从一个源协议、域名、端口三者组合向另一个源发送的请求。由于安全原因浏览器对跨域请求有严格的限制称为同源策略Same-Origin Policy。解决方法在php脚本添加请求头?php// 设置允许访问的域名header(Access-Control-Allow-Origin: *);// 设置允许的请求方法header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS);// 设置允许的请求头header(Access-Control-Allow-Headers: Content-Type, Authorization);在nginx配置中添加请求头十四、如何实现动态图片的生成和处理可以使用 GD 库 或 Imagick 扩展。动态生成或处理图片通常有两大类场景生成新图片验证码、缩略图、带水印的图片、统计图表等。处理已有图片裁剪、缩放、加文字/水印、调整格式或质量。核心步骤是新建画布或加载已有资源绘制/修改内容输出图片并设置HTTP头销毁资源示例//载入$imgimagecreatefrompng(1.png);//设置字体颜色$font_colorimagecolorallocate($img,0,0,0);//imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col ) : bool//imagestring() 用 col 颜色将字符串 s 画到 image 所代表的图像的 xy 坐标处这是字符串左上角坐标整幅图像的左上角为 00。如果 font 是 1234 或 5则使用内置字体。imagestring($img,5,0,0,hello,$font_color);header(Content-Type: image/png);//输出imagepng($img);imagedestroy($img);