mysql 加上order by 查询变慢的解决/记一次find_in_set 查询变慢的解决

《mysql 加上order by  查询变慢的解决/记一次find_in_set 查询变慢的解决》

mysql在数据量较大的时候、使用order by查询结果集时速度很慢的原因

排序字段加DESC后索引没有起作用(如何让索引起作用才是关键 )

//在数据库数据达到20万条左右 , 查询status=1 倒序的数据 在不加强制索引的情况 下用时7秒:
SELECT * FROM tbl_novel_info  WHERE status=1  ORDER BY id desc LIMIT 25;

//强制索引后用时 0.6秒左右
SELECT * FROM tbl_novel_info FORCE INDEX(`status`) WHERE status=1  ORDER BY id desc LIMIT 25;

//laravel 写法:
$res = $query
	->select(['id','name','status'])
	->from(\DB::raw('`tbl_'.$this->table.'` FORCE INDEX (`status`)'))
	->where('status',1)
	->orderBy('id','desc')
	->paginate($per_page,['*'],null,$page_id);

//以此为记

mysql默认是用主键索引 , 但有时主键索引可能会比其他索引慢 , 需要自己去测试到底哪使用哪个索引更合适!!😒

记一次find_in_set 查询变慢的解决

//突然间数据库查询变慢了,不知道什么原因,查来查去找不出原因
SELECT * FROM  tbl_c  WHERE FIND_IN_SET(808,`author_id`)  LIMIT 8;
#SELECT * FROM  tbl_c FORCE INDEX(PRIMARY) WHERE FIND_IN_SET(808,`author_id`)  LIMIT 8;
#SELECT * FROM  tbl_c FORCE INDEX(author_id)  WHERE FIND_IN_SET(3276,`author_id`) LIMIT 8;
#SELECT * FROM  tbl_c  WHERE author_id LIKE '%3276%' LIMIT 8;
/* 受影响记录行数: 0  已找到记录行: 7  警告: 0  持续时间 1 查询: 9.453 秒. */
//平均查询要9秒多, 醉了🤣🤣🤣

//无奈之下,尝试删除了索引author_id , 再次重建索引author_id,奇迹发生了
/* 受影响记录行数: 0  已找到记录行: 8  警告: 0  持续时间 2 条查询: 0.141 秒. (+ 0.125 秒. 网络) */

分析原因,应该是跟之前的"Table is marked as crashed and should be repaired"有关,此前尝试过repair table xxxxxx
//应该是表结构坏了,没有完全修复, 下次遇到"Table is marked as crashed and should be repaired" 就要特别留心了 , 感觉使用HeidiSQL特别容易出现这个错误!!!汗呀😡😡😡, 锅由HeidiSQL背, 这次的教训要牢牢的记住!

//解决方法,导出整个表包括数据, 然后重新导入即可 , 万试万灵,只是比较耗时间
点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注