`

count,size,length到底有什么区别

阅读更多

count,size,length到底有什么区别呢?通过以下的测试结果可以发现问题: 

Post.find_by_id(953125641).comments.length产生了如下的SQL语句 
[4;35;1mPost Columns (0.000000)[0m   [0mSHOW FIELDS FROM `posts`[0m 
  [4;36;1mPost Load (0.016000)[0m   [0;1mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;35;1mComment Load (0.016000)[0m   [0mSELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
 

Post.find_by_id(953125641).comments.size产生了如下的SQL语句 
  [4;36;1mPost Columns (0.000000)[0m   [0;1mSHOW FIELDS FROM `posts`[0m 
  [4;35;1mPost Load (0.016000)[0m   [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;36;1mComment Columns (0.000000)[0m   [0;1mSHOW FIELDS FROM `comments`[0m 
  [4;35;1mSQL (0.015000)[0m   [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m 


Post.find_by_id(953125641).comments.count产生了如下的SQL语句 
  [4;36;1mPost Columns (0.000000)[0m   [0;1mSHOW FIELDS FROM `posts`[0m 
  [4;35;1mPost Load (0.015000)[0m   [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;36;1mComment Columns (0.000000)[0m   [0;1mSHOW FIELDS FROM `comments`[0m 
  [4;35;1mSQL (0.016000)[0m   [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m 


@post = Post.find_by_id(953125641) 
@length = @post.comments.length产生了如下的SQL语句 
  [4;35;1mPost Columns (0.000000)[0m   [0mSHOW FIELDS FROM `posts`[0m 
  [4;36;1mPost Load (0.000000)[0m   [0;1mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;35;1mComment Load (0.000000)[0m   [0mSELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
 

    @post = Post.find_by_id(953125641) 
    @length = @post.comments.size产生了如下的SQL语句 
  [4;36;1mPost Columns (0.015000)[0m   [0;1mSHOW FIELDS FROM `posts`[0m 
  [4;35;1mPost Load (0.016000)[0m   [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;36;1mComment Columns (0.000000)[0m   [0;1mSHOW FIELDS FROM `comments`[0m 
  [4;35;1mSQL (0.000000)[0m   [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m 


    @post = Post.find_by_id(953125641) 
    @length = @post.comments.count产生了如下的SQL语句 
  [4;36;1mPost Columns (0.015000)[0m   [0;1mSHOW FIELDS FROM `posts`[0m 
  [4;35;1mPost Load (0.000000)[0m   [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;36;1mComment Columns (0.000000)[0m   [0;1mSHOW FIELDS FROM `comments`[0m 
  [4;35;1mSQL (0.000000)[0m   [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m 


@post = Post.find_by_id(953125641) 
    @comments = @post.comments 
    @length = @comments.count产生了如下的SQL语句 
  [4;36;1mPost Columns (0.000000)[0m   [0;1mSHOW FIELDS FROM `posts`[0m 
  [4;35;1mPost Load (0.016000)[0m   [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;36;1mComment Columns (0.000000)[0m   [0;1mSHOW FIELDS FROM `comments`[0m 
  [4;35;1mSQL (0.000000)[0m   [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m 
@post = Post.find_by_id(953125641)
 

    @comments = @post.comments 
    @length = @comments.length产生了如下的SQL语句 
  [4;36;1mPost Columns (0.015000)[0m   [0;1mSHOW FIELDS FROM `posts`[0m 
  [4;35;1mPost Load (0.000000)[0m   [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;36;1mComment Load (0.000000)[0m   [0;1mSELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
 

@post = Post.find_by_id(953125641) 
    @comments = @post.comments 
    @length = @comments.size产生了如下的SQL语句 
  [4;35;1mPost Columns (0.016000)[0m   [0mSHOW FIELDS FROM `posts`[0m 
  [4;36;1mPost Load (0.000000)[0m   [0;1mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;35;1mComment Columns (0.015000)[0m   [0mSHOW FIELDS FROM `comments`[0m 
  [4;36;1mSQL (0.000000)[0m   [0;1mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
 

@post = Post.find_by_id(953125641) 
    @comments = @post.comments.find(:all) 
    @length = @comments.size产生了如下的SQL语句 
  [4;35;1mPost Columns (0.015000)[0m   [0mSHOW FIELDS FROM `posts`[0m 
  [4;36;1mPost Load (0.032000)[0m   [0;1mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m 
  [4;35;1mComment Load (0.000000)[0m   [0mSELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
 


由以上的测试数据表明: #count方法总是会产生count(*)的SQL语句去查询数据库,而#length方法总是取查询出的集合的个数,它总是不会产生count(*)的查询,#size方法就比较好了,如果目标集合还没有取出来,它会像#count方法一样,产生count(*)的查询,如果记录已经取出来了,它就像#length方法一样,直接读取集合的个数了。 

基于以上的分析,结论:虽然以上三种方法都可以取得数据记录的个数,但是还是要根据根据实际所需要,调用相应的方法,以达到优化。
 

分享到:
评论

相关推荐

    RLE.zip_RLE_encoding_run length c++_run length code_run length e

    在众多的压缩算法中,Run Length Encoding(RLE)是一种简单且高效的无损压缩方法。本文将深入探讨RLE编码的概念、原理、C++实现以及其在实际应用中的价值。 **一、RLE编码概述** Run Length Encoding(RLE)是...

    RLE.zip_run_run length c++_run length coding

    Run Length Encoding(RLE)是一种简单的无损数据压缩算法,常用于处理连续重复的数据,比如图像数据中的背景颜色。在图像处理中,如果一个颜色连续出现多次,通过记录该颜色出现的次数,而不是连续写入相同的像素值...

    《数据结构》算法实现及解析_高一凡(配合严蔚敏的数据结构)\严蔚敏数据结构习题集答案

    Status DeleteK(SqList &a,int ... if(va.length+1>va.listsize) return ERROR; va.length++; for(i=va.length-1;va.elem[i]>x&&i>=0;i--) va.elem[i+1]=va.elem[i]; va.elem[i+1]=x; return OK; }//Insert_SqList

    array size (数组大小测量)2.zip_数组大小测量

    JavaScript中的数组也有一个`length`属性,如`arr.length`,可以获取数组的大小。 5. **C#**: C#与Java类似,数组也具有`length`属性。例如,`arr.Length`将返回数组的元素数量。 6. **Objective-C/Swift**: ...

    Java-用数组实现栈-队列-线性列表

    return count == arrayLength; } public int size() { return count; } } ``` 在上面的代码中,我们使用一个数组 `array` 来存储队列中的元素,并使用 `head` 变量来记录队列的头部元素的索引,使用 `trail` ...

    java代码-Length

    2. **数组长度**: Java中的数组也有长度属性,可以通过`length`字段来访问。例如,对于一个整数数组: ```java int[] array = new int[5]; int arrayLength = array.length; System.out.println("数组长度为: " + ...

    java五子棋源码

    java编的五子棋 import java.util.*; import java.io.*; import java.awt.*;... if(x+displace_x>=0 && x+displace_x<length && y+displace_y>=0 && y+displace_y<length && grid[x+displace_x][y+...

    C#_TCP发送消息和传输文件

    int readLength = Math.Min(_blockLength, (int)(count - index)); stream.Read(clientData, 0, readLength); fs.Write(clientData, 0, readLength); index += readLength; } fs.Close(); } return true; }...

    delphi读取文件流

    SourceStream.Read(Buffer[0], Length(Buffer), Count); DestStream.Write(Buffer[0], Count); Offset += Count; end; finally SourceStream.Free; DestStream.Free; end; end; ``` 在这个改进版本中,我们...

    dotnet C# 将 Byte 二进制数组使用不安全代码快速转换为 int 或结构体数组.rar

    = 0) throw new ArgumentException("Byte array length must be a multiple of the size of MyStruct"); int count = bytes.Length / Marshal.SizeOf(); MyStruct* structArray = stackalloc MyStruct[count]; ...

    mysql数据库故障排除方案.pdf

    length / ( 1024 * 1024 * 1024 ), 2), 'G') idx,CONCAT(ROUND(( data_length + index_length ) / ( 1024 * 1024 * 1024 ), 2),'G') total_size,ROUND(index_length / data_length, 2) idxfracFROM information_...

    C++上机编程测试纸质资料参考

    - `size_type find(const char *str, size_type index, size_type length);`:查找指定长度的子串。 - `size_type find(char ch, size_type index);`:查找单个字符`ch`。注意,`index`应为`string::size_type`...

    MySQL8.0优化Hint-在SQL中修改会话变量.pdf

    * max_error_count * max_execution_time * max_heap_table_size * max_join_size * max_length_for_sort_data * max_points_in_geometry * max_seeks_for_key * max_sort_length * optimizer_prune_level * ...

    数据结构期末考试模拟题

    if (src.length - srcPos < length || dst.length - dstPos < length) { throw new StringIndexOutOfBoundsException(length); } for (int i = 0; i < length; i++) { dst[dstPos++] = src[srcPos++]; } } ...

    CC1101芯片433M无线传输芯片STM32单片机设计驱动源码.zip

    unsigned char Spi_Read_Packet(unsigned char *Rx_buffer,unsigned char length); void Spi_Write_Packet(unsigned char *Tx_buffer,unsigned char size) ; void Spi_Write_Burst(unsigned char addr,unsigned char...

    八大排序算法总结

    有时候有些属性是有优先级顺序的,那么按照优先级排序也是一种非比较的排序方法。 - **要点**: - 通过多次按照关键字排序,每次排序针对的是某一位上的数字; - 需要一个稳定的内部排序算法。 - **实现**: ``...

    ARM处理器下C语言编程效率优化.pdf

    if (size <= Count) { Count -= size;}`来替代,后者没有除法操作,执行效率更高。 优化除法运算的一种常见方法是用乘法替换除法。在表达式`radius = circle_length / (2 * PI)`中,可以定义一个宏`#define PI_...

    iOS开发:BASE64转换,内含:IOS自带DES加解密

    本示例将探讨iOS系统自带的加密算法——DES(Data Encryption Standard)以及BASE64编码技术,这两种技术在iOS应用开发中都有广泛应用。 首先,我们来了解**BASE64编码**。BASE64是一种常见的字符编码方式,主要...

    动态Bitset源代码

    Bitset(const std::string & str, size_t _Pos, size_t _Count); public: size_t size()const; //返回设置为1的位数 size_t count() const; bool subscript(size_t _Pos) const; bool get(size_t pos) const; ...

    ios-自定义键盘头部.zip

    .text, let length = text.count, length > currentLength { currentLength = length if currentLength > maxLength { // 阻止输入或删除最后一个字符 textInput?.text = String(text.prefix(maxLength)) ...

Global site tag (gtag.js) - Google Analytics