来自php的SQL查询不使用mysql缓存

来自php的SQL查询不使用mysql缓存,php,mysql,caching,Php,Mysql,Caching,Mysql服务器设置为缓存: query_cache_size = 1G query_cache_type = 1 当我从phpmyadmin执行查询时,第一次查询耗时2秒,第二次耗时0.0001秒 所以缓存确实可以工作。但是在php脚本中,查询每次持续花费2秒 php version 5.4.14 mysql 5.5.30 脚本: <?php $db = new mysqli("localhost", "user", "pass", "search"); $t = m

Mysql服务器设置为缓存:

query_cache_size = 1G
query_cache_type = 1
当我从phpmyadmin执行查询时,第一次查询耗时2秒,第二次耗时0.0001秒

所以缓存确实可以工作。但是在php脚本中,查询每次持续花费2秒

php version 5.4.14
mysql 5.5.30
脚本:

<?php
    $db = new mysqli("localhost", "user", "pass", "search");
    $t = microtime(true);
    $res = $db-> query("SELECT 
                            i.page_id, 
                            SUM(i.weight) as w 
                        FROM
                            search.search_index i 
                        INNER JOIN 
                            search.word_full w1 
                            ON w1.word=i.word 
                        INNER JOIN 
                            search.word_full w2 
                            ON w1.word_base=w2.word_base 
                        WHERE 
                            w2.word = 'api' 
                        GROUP BY 
                            i.page_id 
                        ORDER BY NULL");
    print($res->num_rows."\n");
    print(microtime(true) - $t);
?>

<?php
    $link = mysql_connect("localhost", "root", "pass");
    mysql_select_db("search");

    $t = microtime(true);
    $res = $db-> query("SELECT 
                            i.page_id, 
                            SUM(i.weight) as w 
                        FROM
                            search.search_index i 
                        INNER JOIN 
                            search.word_full w1 
                            ON w1.word=i.word 
                        INNER JOIN 
                            search.word_full w2 
                            ON w1.word_base=w2.word_base 
                        WHERE 
                            w2.word = 'api' 
                        GROUP BY 
                            i.page_id 
                        ORDER BY NULL");
    print(mysql_num_rows($res)."\n");
    print(microtime(true) - $t);
?>
脚本返回

235899
1.8554458618164
235899
1.8542320728302
Mysql缓存也不工作

表结构:

CREATE TABLE IF NOT EXISTS `search_index` (
  `page_id` varchar(32) NOT NULL,
  `word` varchar(32) NOT NULL,
  `weight` int(11) NOT NULL,
  PRIMARY KEY (`word`,`page_id`),
  KEY `page_id` (`page_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



CREATE TABLE IF NOT EXISTS `word_full` (
  `word` varchar(32) NOT NULL,
  `word_base` varchar(32) NOT NULL,
  PRIMARY KEY (`word`,`word_base`),
  UNIQUE KEY `word_base` (`word_base`,`word`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

PHP中的每个调用都是一个新实例,与前一个实例无关。除非你明确声明


看看查询缓存:

我在这里假设
word\u full.word\u base
word\u full.word
都是VARCHAR列。如果不是这样,请提供完整的表结构,包括搜索索引和单词完整表的键

我会的

  • 将wordID列添加到word_full(INT UNSIGNED AUTO_INCREMENT NOT NULL)并将其作为主键
  • 在word_full.word上添加唯一关键字
  • 将word_base更改为reference wordID(因此现在wordID和word_base都是数字)
  • 向word\u full.word\u base添加关键字
  • 将search\u index.word更改为search\u index.wordID
  • 添加一个键到search_index.wordID
  • 将单词改为数字键将使MySQL能够更有效地使用索引。目前(我假设)您两次加入一个varchar列,然后搜索一个varchar列。这是相当低效的

    最后,将WHERE移动到连接中可能会允许它在不同的点减少行,因此可能更为优化。这给出了对

    SELECT 
        i.page_id, 
        SUM(i.weight) as w 
    
    FROM search.search_index i 
    
    INNER JOIN search.word_full w1 
        ON w1.wordID = i.wordID
    
    INNER JOIN search.word_full w2 
        ON w1.wordID_base = w2.wordID_base 
        AND w2.word = 'api' 
    
    GROUP BY i.page_id 
    ORDER BY NULL
    

    phpmyadmin修改查询

    SELECT 
        i.page_id, 
        SUM(i.weight) as w 
    FROM
        search.search_index i 
    INNER JOIN 
        search.word_full w1 
        ON w1.word=i.word 
    INNER JOIN 
        search.word_full w2 
        ON w1.word_base=w2.word_base 
    WHERE 
        w2.word = 'api' 
    GROUP BY 
        i.page_id 
    ORDER BY NULL
    

    在查询结束处添加限制0,30

    和查询大小>查询\u缓存\u限制


    我将查询缓存限制提高到10米

    我假设他可能是指mysql内部查询缓存,我昨天测试了mysqlnd qc。不太管用。phpmyadmin不工作吗?mysql在查询中也使用了常量?查询工作正常。如果我在控制台中使用phpmyadmin和Mysql,那么就使用Mysql。正如我在回答中提到的,如果您能够为我们提供包括键在内的表结构,那么它将有所帮助。很可能您的列类型或键不合适。
    SELECT 
        i.page_id, 
        SUM(i.weight) as w 
    FROM
        search.search_index i 
    INNER JOIN 
        search.word_full w1 
        ON w1.word=i.word 
    INNER JOIN 
        search.word_full w2 
        ON w1.word_base=w2.word_base 
    WHERE 
        w2.word = 'api' 
    GROUP BY 
        i.page_id 
    ORDER BY NULL
    
    SELECT 
        i.page_id, 
        SUM(i.weight) as w 
    FROM
        search.search_index i 
    INNER JOIN 
        search.word_full w1 
        ON w1.word=i.word 
    INNER JOIN 
        search.word_full w2 
        ON w1.word_base=w2.word_base 
    WHERE 
        w2.word = 'api' 
    GROUP BY 
        i.page_id 
    ORDER BY NULL
    LIMIT 0, 30