草庐IT

mysql COUNT() 行数太慢

coder 2023-10-09 原文

我正在尝试从具有 22m 行的表中获取用户的订阅者数量。

我的sql如下:

SELECT
    COUNT(id)
FROM
    subscribers
WHERE
    suid=541839243781

加载需要12.6020 s

但是以下相同的查询(获取用户的订阅)只需要 0.0036 秒 来加载(似乎没问题)

SELECT
    COUNT(uid)
FROM
    subscribers
WHERE
    uid=541839243781

我的解释:

    id  select_type     table            type   possible_keys    key    key_len     ref     rows                 Extra
     1     SIMPLE    dvx_subscribers    index        4            4       16        NULL    22041275    Using where; Using index

显示创建表:

    CREATE TABLE `subscribers` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `sid` bigint(20) unsigned NOT NULL,
 `uid` bigint(20) unsigned NOT NULL,
 `suid` bigint(20) unsigned NOT NULL,
 `date` datetime NOT NULL,
 KEY `id` (`id`),
 KEY `2` (`uid`,`suid`),
 KEY `4` (`suid`,`id`)
) ENGINE=MyISAM AUTO_INCREMENT=23226599 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

索引:

Table   Non_unique  Key_name    Seq_in_index    Column_name     Collation   Cardinality     Sub_part    Packed  Null    Index_type  Comment
subscribers     1   id  1   id  A   NULL    NULL    NULL        BTREE   
subscribers     1   2   1   uid     A   449821  NULL    NULL        BTREE   
subscribers     1   2   2   suid    A   459193  NULL    NULL        BTREE   
subscribers     1   4   1   suid    A   6115    NULL    NULL        BTREE   
subscribers     1   4   2   id  A   22041275    NULL    NULL        BTREE   

我怎样才能索引它或优化它以尽可能快地加载?因为 12 秒对于这个来说太过分了......

最佳答案

第二个查询针对索引 (uid) 运行,因此它几乎是瞬间完成的。但是,第一个需要扫描表,因为没有合适的索引可以使用。在 (suid, id) 上创建索引以解决此问题。

关于mysql COUNT() 行数太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10233588/

有关mysql COUNT() 行数太慢的更多相关文章

  1. vue 实现内容超出两行显示展开更多功能,可依据需求自定义任意行数! - 2

    平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示展开更多按钮,点击即可显示全部内容,先来看看效果图: 这样做用户体验瞬间得到提升,接下来看看具体细节。0">主要操作在内容这里{{item.username}},……展开更多样式大家可依据自己项目需求进行设计,这里就不贴了,主要说几个关键的。1、在data中定义三个属性isShowMore:false, //控制展开更多的显示与隐藏textHeight:null, //框中内容的高度status:false, //内容状态是否打开2.计算内容是否

  2. ruby - 为什么行数太多的方法是一件坏事? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭7年前。Improvethisquestion在我的Rails应用程序中,我有一个这样的方法:defcartifuser_signed_in?@user=current_userif@user.cart.present?@cart=@user.cartelse@cart=falseendelsecart_id=session[:cart_id]ifcart_id.present?@cart=Cart.find(cart_id.to_i

  3. ruby-on-rails - 使用 named_scope 获取行数 - 2

    Rails专家:感谢另一位SO用户,我刚刚发现了named_scope。:)我想获取一组行的计数-即SELECTCOUNT(*)。此外,我希望仍然能够在调用中链接命名范围。这是命名范围的合法(尽管很奇怪)用法吗?named_scope:count,:select=>"COUNT(*)ascount_all"然后我可以做(例如):@foobar=Foobar.count.scope.scope.scope计数通过@foobar.first.count_all访问。(EditedtoaddressAllan'scomments)你可以这样做:@foobar=Foobar.scope.sco

  4. ruby-on-rails - 计算CSV文件的长度(行数)? - 2

    我有一个表单(Rails),它允许我使用file_field加载.csv文件。在View中:{:multipart=>true})do|f|%>单击提交会将我重定向到另一个页面(create.html.erb)。该文件加载正常,我能够在第二页中正常阅读内容。我试图在第二页中显示.csv文件中的行数。我的Controller(半伪代码):classUpcsvController当我的文件仅包含7行时,file.length和file.size都返回“91”。从我阅读的Rails文档中,单击“提交”按钮后,Rails会创建上传文件的临时文件,params[:upcsv][:filename

  5. ruby - 在 Ruby 语言中,如何获取字符串中的行数? - 2

    在Ruby语言中,如何获取字符串中的行数? 最佳答案 字符串有一个lines方法,它返回一个Enumerator。在枚举器上调用count。str="Hello\nWorld"str.lines.count#2str="Hello\nWorld\n"#trailingnewlineisignoredstr.lines.count#2lines方法是在Ruby1.8.7中引入的。如果您使用的是旧版本,请查看@mipadi和@Greg的回答。 关于ruby-在Ruby语言中,如何获取字符串中

  6. ruby-on-rails - ruby - bundle 安装/更新太慢 - 2

    我刚刚在virtualbox中运行的虚拟ubuntu12.0432位上安装了RVM、Ruby、Rails等。现在我遇到的问题是,对于我的第一个Rails项目,bundleinstall或bundleupdate需要很长时间。即使我使用Rails创建一个新项目(包括bundleinstall)。我只使用标准的gem:source'https://rubygems.org'gem'rails','3.2.12'#BundleedgeRailsinstead:#gem'rails',:git=>'git://github.com/rails/rails.git'group:developme

  7. ruby - 如何使用 capybara + cucumber 断言 ruby​​ 中的 html 表行数 - 2

    我正在尝试使用Cucumber+capybara来掌握Ruby中的BDDweb开发,但我被困在了本应是一项简单任务的任务上——只是检查表格中的行数。我想要实现的目标是:page.shouldhave_xpath("//table[@id='myTable']")find("//table[@id='myTable']/tr").length.should==3但这不起作用(缺少方法长度),我找不到一种方法来断言表长度。任何人的任何想法(请对我放轻松'我是ruby菜鸟)提前致谢尼尔 最佳答案 即使have_css?可以解决问题,您的测

  8. ruby-on-rails - 如何统计代码行数? - 2

    我试过rakestats但这似乎非常不准确。也许它忽略了几个目录? 最佳答案 我使用免费的Perl脚本cloc。示例用法:phrogz$cloc.180textfiles.180uniquefiles.77filesignored.http://cloc.sourceforge.netv1.56T=1.0s(104.0files/s,19619.0lines/s)-------------------------------------------------------------------------------Languag

  9. ruby - 在不将整个文件读入内存的情况下计算文件中的行数? - 2

    我正在处理庞大的数据文件(每个文件有数百万行)。在我开始处理之前,我想计算文件中的行数,这样我就可以指出处理的进度。由于文件的大小,将整个文件读入内存是不切实际的,只是计算有多少行。有人对如何执行此操作有好的建议吗? 最佳答案 一次一行读取文件:count=File.foreach(filename).inject(0){|c,line|c+1}或Perl-ishFile.foreach(filename){}count=$.或count=0File.open(filename){|f|count=f.read.count("\n"

  10. javascript - 具有 1000 万个项目的两个数组的差异 - _.difference 太慢了 - 2

    我有两个包含用户ID的数组,我想检查其中的不同项目。arr1=[123,456,789];arr2=[123,456,789,098];问题是:这些数组可以有10或2000万个项目。我正在尝试使用underscore.difference()但需要10分钟才能完成。有没有更快的方法来做到这一点? 最佳答案 如何将数组转换为对象以降低排序的复杂性:vararr1=[123,456,789],arr2=[123,456,789,098];functiontoObject(arr){returnarr.reduce(function(o,

随机推荐