
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背, 这次的教训要牢牢的记住!
//解决方法,导出整个表包括数据, 然后重新导入即可 , 万试万灵,只是比较耗时间