Maison >cadre php >Laravel >Les enregistrements d'apprentissage Laravel forcent l'index spécifié pour la requête

Les enregistrements d'apprentissage Laravel forcent l'index spécifié pour la requête

藏色散人
藏色散人avant
2021-11-05 14:20:452629parcourir

La base de données n'utilise pas l'index que nous avons imaginé pour les requêtes SQL, ce qui entraîne une requête extrêmement lente.

Instruction de requête d'index de force mysql数据库没有使用我们设想的索引进行sql查询,导致查询特别慢。

mysql强制索引查询语句

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

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

select * de l'utilisateur où age = 26 force index(age); // Force index
select * from user which age = 26 use index(age); // Prioriser la recherche en fonction de cet index

/**
 * 检测某个表中是否存在某个索引
 * @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);
    }
}

Vous devez écrire ceci dans le code Laravel :

Utilisez la méthode when pour juger ici Cet index existe-t-il ? S'il n'existe pas, cet index ne sera pas utilisé. Sinon, une erreur sera signalée pour empêcher quelqu'un de supprimer accidentellement l'index, ce qui entraînerait le signalement d'une erreur par le système.

La déclaration pour forcer l'indexation ici est : 🎜
->from(DB::raw('`erp_agents` FORCE INDEX (`test`)'))
🎜Par exemple : 🎜
$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;]);
🎜[Recommandations associées : 🎜Les cinq derniers didacticiels vidéo Laravel🎜]🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer