首页 >php框架 >Laravel >laravel学习记录之强制指定索引进行查询

laravel学习记录之强制指定索引进行查询

藏色散人
藏色散人转载
2021-11-05 14:20:452580浏览

为什么需要强制索引?

数据库没有使用我们设想的索引进行sql查询,导致查询特别慢。

mysql强制索引查询语句

  • select * from user where age = 26 force index(age); // 强制索引

  • select * from user where age = 26 use index(age); // 优先按照这种索引查找

/**
 * 检测某个表中是否存在某个索引
 * @param $table
 * @param $index
 * @return bool
 * @author zhaohao
 * @date 2019-08-26 17:42
 */
if(!function_exists('hasIndex')) {
    function hasIndex($table, $name)
    {
        $conn = IlluminateSupportFacadesSchema::getConnection();
        $dbSchemaManager = $conn->getDoctrineSchemaManager();
        $doctrineTable = $dbSchemaManager->listTableDetails($table);
        return $doctrineTable->hasIndex($name);
    }
}
  • 在laravel的代码里面需要这样写:

在这里用when方法来判断此索引是否存在,日过不存在的话就不用这个索引,不然会报错,避免有人误删索引后,导致系统报错。

此处强制索引的语句是:

->from(DB::raw('`erp_agents` FORCE INDEX (`test`)'))

例如:

$agents = Agent::where($whereType)
            ->when(hasIndex('Agent', 'test'),function ($q){
                $q->from(DB::raw('`erp_agents` FORCE INDEX (`test`)'));
            })
            ->when(request('position',false),function ($q){
                $q->whereIn('position_id',request('position'));
            })
            ->whereIn('agents.status', $validStatus)
            ->where(&#39;worked_at&#39;, &#39;<=&#39;, $end)
            ->where(&#39;is_suppose&#39;, 0)
            ->addDomination(&#39;m.statistics-human-view&#39;)
            ->leftJoin(&#39;positions&#39;, &#39;positions.id&#39;, &#39;=&#39;, &#39;agents.position_id&#39;)
            ->get([&#39;worked_days&#39;, &#39;worked_at&#39;]);

【相关推荐:最新的五个Laravel视频教程

以上是laravel学习记录之强制指定索引进行查询的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:learnku.com。如有侵权,请联系admin@php.cn删除