mysql - codeigniter , mysql查询性能问题

标签 mysql performance codeigniter cpu-usage

我正在使用 codeigniter 和 mysql 并在具有 200 MB 内存和 1 GB CPU 的服务器中应用,得到 40.000 行 类别中的表 a(索引:idx_cat)和 44 行(索引:主要),我需要在每个类别中获得前 4 名,这是我的查询

SELECT id,title,preview,created,image,dummy,name 
FROM
 (
 select news.id AS id,news.title AS title,preview,created,news.image,category_id ,
         @num := if(@cat = category_id, @num + 1, 1) as row_number,
         @cat := category_id as dummy,
        name,d_order
 from news use index (idx_cat) inner join category b on category_id=b.id
 where 
    news.category_id in (9,8,3,35,57,56,15,58,41,42,43,44,34,52,37,38,36,11) and
    news.status = 1 
 having row_number <= 4 
 order by dummy ASC,news.created desc
 ) as a 
order by d_order ASC,created DESC



id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   PRIMARY     <derived2>  ALL     NULL    NULL    NULL    NULL    **29639**   Using filesort
2   DERIVED     b   ALL     PRIMARY,id  NULL    NULL    NULL    **44**  Using where; Using temporary; Using filesort
2   DERIVED     news    ref     idx_cat     idx_cat     **4**   b.id    846     Using where    

并得到其他 6 个简单的 join like

   select id,name from others a inner join b on a.cat_id = b.id

网站加载速度非常快,大约 1 或 2 秒,但如果在另一个选项卡中打开,而另一个选项卡加载速度有点慢,如 5-7 秒。

奇怪的是 cpu 使用率达到 100%,内存使用量达到 +_ 40 MB 才能完成一个 View (我确定没有打开其他 View )但 CI PROFILING 它说只有用户 4MB。

我也有加载模型、助手和按需库,只有两个(url 和表单)我放在自动加载文件中。

如果我打开 5 到 10 个窗口,它说内存不足,你们有什么建议吗,这让我发疯 -_-

最佳答案

要减小内部选择结果的大小,将字段named_order 的选择和连接移动到外部选择

SELECT id,title,preview,created,image,dummy,name,d_order FROM
     (
 select news.id AS id,news.title AS title,preview,created,news.image,category_id ,
         @num := if(@cat = category_id, @num + 1, 1) as row_number,
         @cat := category_id as dummy
 from news use index (idx_cat) 
 where 
    news.category_id in (9,8,3,35,57,56,15,58,41,42,43,44,34,52,37,38,36,11) and
    news.status = 1 
 having row_number <= 4 
 order by dummy ASC,news.created desc
 ) as a inner join category b on category_id=b.id
order by d_order ASC,created DESC

可能行数还是很大,但是我们减少了内存。您选择的方式需要处理整个新闻表,然后在非常昂贵的计算中删除不需要的行。如果仅使用 news.id、cat.id 和最小字段对新闻进行预选,可能会更有效率,因此新闻正文和重字段在重选择之外。

SELECT id,c.title,c.preview,created,c.image,dummy,name,d_order FROM
     (
 select news.id AS id,category_id ,
         @num := if(@cat = category_id, @num + 1, 1) as row_number,
         @cat := category_id as dummy
 from news use index (idx_cat) 
 where 
    news.category_id in (9,8,3,35,57,56,15,58,41,42,43,44,34,52,37,38,36,11) and
    news.status = 1 
 having row_number <= 4 
 order by dummy ASC,news.created desc
 ) as a 
    inner join category b on category_id=b.id
    inner join news c on a.id = c.id
    order by d_order ASC,created DESC

可能我有一些语法错误,但在这里写起来有点困难,而且我没有要测试的数据。希望你明白我看到的问题所在。

关于mysql - codeigniter , mysql查询性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438371/

相关文章:

.net - 对于只读、无序的唯一字符串集合,性能最快的选项是什么?

java - 单个阵列是否比 2 个不同的阵列快?

PHP, MySQL - 通过连接从多个表中删除

mysql - 相关子查询更新

mysql - 发送 put 请求时,updatedAt 列未使用最新日期时间更新

php - mySQL 语句 ORDER BY 多列

mysql - 如何为数据数组sql创建短代码

cpanel 中的 php cron 作业无法正常工作。电子邮件中没有错误

c - 为什么将 mod 与 int64_t 操作数一起使用会使此函数慢 150%?

mysql - 遇到 PHP 错误,严重性 : Notice Message: Undefined index