iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中查询字段数量多少会对查询效率有影响
  • 829
分享到

MySQL中查询字段数量多少会对查询效率有影响

2024-04-02 19:04:59 829人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Mysql中查询字段数量多少会对查询效率有影响,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、问题由来我们知道执行计划的不同肯定会带来效率的

这篇文章将为大家详细讲解有关Mysql中查询字段数量多少会对查询效率有影响,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、问题由来

我们知道执行计划的不同肯定会带来效率的不同,但是在本例中执行计划完全一致,都是全表扫描,不同的只有字段个数而已。其次,测试中都使用了where条件进行过滤(Using where),过滤后没有数据返回,我们常说的where过滤实际上是在mysql层,当然某些情况下使用ICP会提前在Innodb层过滤数据,这里我们先不考虑ICP,我会在后面的文章中详细描述ICP的流程,本文也会给出where过滤的接口,供大家参考。

下面的截图来自两个朋友,感谢他们的测试和问题提出。另外对于大数据量访问来讲可能涉及到物理io,首次访问和随后的访问因为Innodb buffer的关系,效率不同是正常,需要多测试几次。

测试1:

MySQL中查询字段数量多少会对查询效率有影响

MySQL中查询字段数量多少会对查询效率有影响

MySQL中查询字段数量多少会对查询效率有影响

测试2:

MySQL中查询字段数量多少会对查询效率有影响

我们通过这两个测试,可以发现随着字段的不断减少,效率越来越高,并且主要的区别都在sending data 下面,这个状态我曾经大概描述过参考文章:
https://www.jianshu.com/p/46ad0aaf7ed7
Https://www.jianshu.com/p/4cdec711adef

简单的说Innodb数据的获取和Innodb数据到Mysql层数据的传递都包含在其中。

二、简单的流程介绍

下面我主要结合字段多少和全表扫描2个方面做一个简单的流程介绍。实际上其中有一个核心接口就是row_search_mvcc,它大概包含了如下功能:

  • 通过预取缓存获取数据

  • 打开事务

  • 定位索引位置(包含使用AHI快速定位)

  • 是否开启readview

  • 通过持久化游标不断访问下一条数据

  • 加Innodb表、加Innodb行锁

  • 可见性判断

  • 根据主键回表(可能回表需要加行锁)

  • ICP优化

  • SEMI update优化

并且作为访问数据的必须经历的接口,这个函数也是很值得大家细细研读的。

1. 通过select字段构建read_set(MySQL层)

首先需要构建一个叫做read_set的位图,来表示访问的字段位置及数量。它和write set一起,在记录binlog的Event的时候也会起着重要作用,可以参考我的《深入理解MySQL主从原理》中关于binlog_row_image参数一节。这里构建的主要接口为TABLE::mark_column_used函数,每个需要访问的字段都会调用它来设置自己的位图。下面是其中的一段如下:

case MARK_COLUMNS_READ:
    bitmap_set_bit(read_set, field->field_index);

从栈帧来看这个构建read_set的过程位于状态‘init’下面。栈帧见结尾栈帧1。

2. 初次访问定位的时候还会构建一个模板(mysql_row_templ_t)(Innodb层)

本模板主要用于当Innodb层数据到MySQL层做转换的时候使用,其中记录了使用的字段数量、字段的字符集、字段的类型等等。接口build_template_field用于构建这个模板。栈帧见结尾栈帧2。
但是需要注意的是,这里构建模板就会通过我们上面说的read_set去判断到底有多少字段需要构建到模板中,然后才会调用build_template_field函数。如下是最重要的代码,它位于build_template_needs_field接口中。

bitmap_is_set(table->read_set, static_cast<uint>(i)

可以看到这里正在测试本字段是否出现在了read_set中,如果不在则跳过这个字段。下面是函数build_template_needs_field的注释:

Determines if a field is needed in a m_prebuilt struct 'template'.
@return field to use, or NULL if the field is not needed */

到这里我们需要访问的字段已经确立下来了

3. 初次定位数据,定位游标到主键索引的第一行记录,为全表扫描做好准备(Innodb层)

对于这种全表扫描的执行方式,定位数据就变得简单了,我们只需要找到主键索引的第一条数据就好了,它和平时我们使用(ref/range)定位方式不同,不需要二分法的支持。因此对于全表扫描的初次定位调用函数为btr_cur_open_at_index_side_func,而不是通常我们说的btr_pcur_open_with_no_init_func。
如果大概看一下函数btr_cur_open_at_index_side_func的功能,我们很容易看到,它就是通过B+树结构,定位到叶子结点的开头第一个块,然后调用函数page_cur_set_before_first,将游标放到了所有记录的开头,目的只有一个为全表扫描做好准备。栈帧见结尾栈帧3。
注意这里正是通过我们row_search_mvcc调用下去的。

4. 获取Innodb层的第一条数据(Innodb层)

拿到了游标过后就可以获取数据了,这里也很简单代码就是一句如下:

rec = btr_pcur_get_rec(pcur);//获取记录 从持久化游标   整行数据

但是需要注意的是这里获取的数据只是一个指针,言外之意可以理解为整行数据,其格式也是原始的Innodb数据,其中还包含了一些伪列比如(rollback ptr和trx id)。这里实际上和访问的字段个数无关。

5. 将第一行记录转换为MySQL格式(Innodb层)

这一步完成后我们可以认为记录已经返回给了MySQL层,这里就是实际的数据拷贝了,并不是指针,整个过程放到了函数row_sel_store_mysql_rec中。
我们前面的模板(mysql_row_templ_t)也会在这里发挥它的作用,这是一个字段过滤的过程,我们先来看一个循环

for (i = 0; i < prebuilt->n_template; i++)

其中prebuilt->n_template就是字段模板的个数,我们前面已经说过了,通过read_set的过滤,对于我们不需要的字段是不会建立模板的。因此这里的模板数量是和我们访问的字段个数一样的。

然后在这个循环下面会调用row_sel_store_mysql_field_func然后调用row_sel_field_store_in_mysql_fORMat_func将字段一个一个转换为MySQL的格式。我们来看一下其中一种类型的转换如下:

    case DATA_INT:
        
        ptr = dest + len;
        for (;;) {
            ptr--;
            *ptr = *data;//值拷贝 内存拷贝
            if (ptr == dest) {
                break;
            }
            data++;
        }

我们可以发现这是一种实际的转换,也就是需要花费内存空间的。栈帧见结尾栈帧4。
到这里我们大概知道了,查询的字段越多那么着这里转换的过程越长,并且这里都是实际的内存拷贝

最终这行数据会存储到row_search_mvcc的形参 buffer中返回给MySQL层,这个形参的注释如下:

@param[out]    buf        buffer for the fetched row in MySQL format
6.对第一条数据进行where过滤(MySQL层)

拿到数据后当然还不能作为最终的结果返回给用户,我们需要在MySQL层做一个过滤操作,这个条件比较位于函数evaluate_join_record的开头,其中比较就是下面一句话

found= MY_TEST(condition->val_int()); //进行比较 调用到 条件和 返回会记录的比较

如果和条件不匹配将会返回False。这里比较会最终调用Item_func的各种方法,如果等于则是Item_func_eq,栈帧见结尾栈帧5。

7.访问下一条数据

上面我已经展示了访问第一条数据的大体流程,接下面需要做的就是继续访问下去,如下:

  • 移动游标到下一行

  • 访问数据

  • 根据模板转换数据返回给MySQL层

  • 根据where条件过滤

整个过程会持续到全部主键索引数据访问完成。但是需要注意的是上层接口有些变化,由ha_innobase::index_first会变为ha_innobase::rnd_next,统计数据由Handler_read_first变为Handler_read_rnd_next,这点可以参考我的文章:
https://www.jianshu.com/p/25fed8f1f05e
并且row_search_mvcc的流程肯定也会有变化。这里不再熬述。但是实际的获取数据转换过程和过滤过程并没有改变。

注意了这些步骤除了步骤1,基本都处于sending data下面

三、回到问题本身

好了到这里我们大概知道全表扫描的访问数据的流程了,我们就来看看一下在全表扫描流程中字段的多少到底有哪些异同点:

不同点:
  • 构建的read_set 不同,字段越多read_set中为‘1’的位数越多

  • 建立的模板不同,字段越多模板数量越多

  • 每行数据转换为MySQL格式的时候不同,字段越多模板越多,那么循环转换每个字段的循环次数也就越多,并且这是每行都要处理的。

  • 返回给MySQL层的行内存消耗越大

相同点:
  • 访问的行数一致

  • 访问的流程一致

  • where过滤的方式一致

在整个不同点中,我认为最耗时的部分应该是每行数据转换为MySQL格式的消耗最大,因为每行每个字段都需要做这样的转换,这也刚好是除以sending data状态下面。我们线上大于10个字段的表比比皆是,如果我们只需要访问其中的少量字段,我们最好还是写实际的字段而不是‘*’,来规避这个问题。

四、写在最后

虽然本文中以全表扫描为列进行了解释,但是实际上任何情况下我们都应该缩减访问字段的数量,应该只访问需要的字段。

五、备用栈帧

栈帧1 read_set构建

#0  TABLE::mark_column_used (this=0x7ffe7c996c50, thd=0x7ffe7c000b70, field=0x7ffe7c997c88, mark=MARK_COLUMNS_READ)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/table.cc:6344
#1  0x00000000015449b4 in find_field_in_table_ref (thd=0x7ffe7c000b70, table_list=0x7ffe7c0071f0, name=0x7ffe7c006a38 "id", length=2, item_name=0x7ffe7c006a38 "id", 
    db_name=0x0, table_name=0x0, ref=0x7ffe7c006bc0, want_privilege=1, allow_rowid=true, cached_field_index_ptr=0x7ffe7c0071a0, reGISter_tree_change=true, 
    actual_table=0x7fffec0f46d8) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_base.cc:7730
#2  0x0000000001544efc in find_field_in_tables (thd=0x7ffe7c000b70, item=0x7ffe7c0070c8, first_table=0x7ffe7c0071f0, last_table=0x0, ref=0x7ffe7c006bc0, 
    report_error=IGNORE_EXCEPT_NON_UNIQUE, want_privilege=1, register_tree_change=true) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_base.cc:7914
#3  0x0000000000faadd8 in Item_field::fix_fields (this=0x7ffe7c0070c8, thd=0x7ffe7c000b70, reference=0x7ffe7c006bc0)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/item.cc:5857
#4  0x00000000015478ee in setup_fields (thd=0x7ffe7c000b70, ref_pointer_array=..., fields=..., want_privilege=1, sum_func_list=0x7ffe7c005d90, allow_sum_func=true, 
    column_update=false) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_base.cc:9047
#5  0x000000000161419d in st_select_lex::prepare (this=0x7ffe7c005c30, thd=0x7ffe7c000b70) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_resolver.cc:190

栈帧2 构建模板

#0  build_template_field (prebuilt=0x7ffe7c99b880, clust_index=0x7ffe7c999c20, index=0x7ffe7c999c20, table=0x7ffe7c996c50, field=0x7ffe7c997c88, i=0, v_no=0)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:7571
#1  0x00000000019d1dc1 in ha_innobase::build_template (this=0x7ffe7c997610, whole_row=false)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:8034
#2  0x00000000019d60f5 in ha_innobase::change_active_index (this=0x7ffe7c997610, keynr=0)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:9805
#3  0x00000000019d682b in ha_innobase::rnd_init (this=0x7ffe7c997610, scan=true)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:10031
#4  0x0000000000f833b9 in handler::ha_rnd_init (this=0x7ffe7c997610, scan=true) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/handler.cc:3096
#5  0x00000000014e24d1 in init_read_record (info=0x7ffe7cf47d60, thd=0x7ffe7c000b70, table=0x7ffe7c996c50, qep_tab=0x7ffe7cf47d10, use_record_cache=1, 
    print_error=true, disable_rr_cache=false) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/records.cc:315

栈帧3 全表扫描初次定位栈帧

#0  page_cur_set_before_first (block=0x7fff4d02f4a0, cur=0x7ffe7c99bab0) at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/include/page0cur.ic:99
#1  0x0000000001c5187f in btr_cur_open_at_index_side_func (from_left=true, index=0x7ffe7c999c20, latch_mode=1, cursor=0x7ffe7c99baa8, level=0, 
    file=0x239d388 "/root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/include/btr0pcur.ic", line=562, mtr=0x7fffec0f3570)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/btr/btr0cur.cc:2422
#2  0x0000000001b6e9c9 in btr_pcur_open_at_index_side (from_left=true, index=0x7ffe7c999c20, latch_mode=1, pcur=0x7ffe7c99baa8, init_pcur=false, level=0, 
    mtr=0x7fffec0f3570) at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/include/btr0pcur.ic:562
#3  0x0000000001b79a35 in row_search_mvcc (buf=0x7ffe7c997b50 "\377", mode=PAGE_CUR_G, prebuilt=0x7ffe7c99b880, match_mode=0, direction=0)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/row/row0sel.cc:5213
#4  0x00000000019d5493 in ha_innobase::index_read (this=0x7ffe7c997610, buf=0x7ffe7c997b50 "\377", key_ptr=0x0, key_len=0, find_flag=HA_READ_AFTER_KEY)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:9536
#5  0x00000000019d66ea in ha_innobase::index_first (this=0x7ffe7c997610, buf=0x7ffe7c997b50 "\377")
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:9977
#6  0x00000000019d6934 in ha_innobase::rnd_next (this=0x7ffe7c997610, buf=0x7ffe7c997b50 "\377")
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:10075
#7  0x0000000000f83725 in handler::ha_rnd_next (this=0x7ffe7c997610, buf=0x7ffe7c997b50 "\377")
    at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/handler.cc:3146
#8  0x00000000014e2b3D in rr_sequential (info=0x7ffe7cf47d60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/records.cc:521

栈帧4 MySQL格式的转换

#0  row_sel_field_store_in_mysql_format_func (dest=0x7ffe7c997b51 "", templ=0x7ffe7c9a27f8, index=0x7ffe7c999c20, field_no=0, data=0x7fff4daec0a1 "\200", len=4, 
    prebuilt=0x7ffe7c99b880, sec_field=18446744073709551615) at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/row/row0sel.cc:2888
#1  0x0000000001b754b9 in row_sel_store_mysql_field_func (mysql_rec=0x7ffe7c997b50 "\377", prebuilt=0x7ffe7c99b880, rec=0x7fff4daec0a1 "\200", index=0x7ffe7c999c20, 
    offsets=0x7fffec0f3a80, field_no=0, templ=0x7ffe7c9a27f8, sec_field_no=18446744073709551615)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/row/row0sel.cc:3255
#2  0x0000000001b75c85 in row_sel_store_mysql_rec (mysql_rec=0x7ffe7c997b50 "\377", prebuilt=0x7ffe7c99b880, rec=0x7fff4daec0a1 "\200", vrow=0x0, rec_clust=0, 
    index=0x7ffe7c999c20, offsets=0x7fffec0f3a80, clust_templ_for_sec=false) at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/row/row0sel.cc:3434
#3  0x0000000001b7bd61 in row_search_mvcc (buf=0x7ffe7c997b50 "\377", mode=PAGE_CUR_G, prebuilt=0x7ffe7c99b880, match_mode=0, direction=0)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/row/row0sel.cc:6123
#4  0x00000000019d5493 in ha_innobase::index_read (this=0x7ffe7c997610, buf=0x7ffe7c997b50 "\377", key_ptr=0x0, key_len=0, find_flag=HA_READ_AFTER_KEY)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:9536
#5  0x00000000019d66ea in ha_innobase::index_first (this=0x7ffe7c997610, buf=0x7ffe7c997b50 "\377")
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:9977
#6  0x00000000019d6934 in ha_innobase::rnd_next (this=0x7ffe7c997610, buf=0x7ffe7c997b50 "\377")
    at /root/mysqlall/percona-server-locks-detail-5.7.22/storage/innobase/handler/ha_innodb.cc:10075
#7  0x0000000000f83725 in handler::ha_rnd_next (this=0x7ffe7c997610, buf=0x7ffe7c997b50 "\377")
    at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/handler.cc:3146
#8  0x00000000014e2b3d in rr_sequential (info=0x7ffe7cf47d60) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/records.cc:521
#9  0x0000000001584264 in join_init_read_record (tab=0x7ffe7cf47d10) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_executor.cc:2487
#10 0x0000000001581349 in sub_select (join=0x7ffe7cf47660, qep_tab=0x7ffe7cf47d10, end_of_records=false)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_executor.cc:1277
#11 0x0000000001580cce in do_select (join=0x7ffe7cf47660) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_executor.cc:950

栈帧5 String的等值比较

#0  Arg_comparator::compare_string (this=0x7ffe7c0072f0) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/item_cmpfunc.cc:1669
#1  0x0000000000fde1e4 in Arg_comparator::compare (this=0x7ffe7c0072f0) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/item_cmpfunc.h:92
#2  0x0000000000fcb0a1 in Item_func_eq::val_int (this=0x7ffe7c007218) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/item_cmpfunc.cc:2507
#3  0x0000000001581af9 in evaluate_join_record (join=0x7ffe7c0077d8, qep_tab=0x7ffe7cb1dc70)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_executor.cc:1492
#4  0x000000000158145a in sub_select (join=0x7ffe7c0077d8, qep_tab=0x7ffe7cb1dc70, end_of_records=false)
    at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_executor.cc:1297
#5  0x0000000001580cce in do_select (join=0x7ffe7c0077d8) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_executor.cc:950
#6  0x000000000157eb8a in JOIN::exec (this=0x7ffe7c0077d8) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_executor.cc:199

关于“MySQL中查询字段数量多少会对查询效率有影响”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中查询字段数量多少会对查询效率有影响

本文链接: https://www.lsjlt.com/news/62295.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中查询字段数量多少会对查询效率有影响
    这篇文章将为大家详细讲解有关MySQL中查询字段数量多少会对查询效率有影响,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、问题由来我们知道执行计划的不同肯定会带来效率的...
    99+
    2024-04-02
  • mysql利用子查询效率后有哪些效率影响
    这篇文章将为大家详细讲解有关mysql利用子查询效率后有哪些效率影响,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql子查询效率:利用子查询【SELECT ...
    99+
    2024-04-02
  • mysql如何查询字段数量
    本篇内容介绍了“mysql如何查询字段数量”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • mysql怎么查询字段数量
    这篇文章主要讲解了“mysql怎么查询字段数量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql怎么查询字段数量”吧! 查...
    99+
    2023-05-25
    mysql
  • MySql数据库单表查询与多表连接查询效率对比
    这段时间在做项目的过程中,遇到一个模块,数据之间的联系很复杂,在建表的时候就很纠结,到底该怎么去处理这些复杂的数据呢,是单表查询,然后在业务层去处理数据间的关系,还是直接通过多表连接...
    99+
    2024-04-02
  • MySQL学习总结(查询所有字段、查询指定字段、查询去重数据、条件查询)
    目录 一、SELECT语句查询 二、查询所有字段 1、列出所有字段名称进行查询 2、使用通配符 * 进行查询 三、查询指定字段 四、查询去重数据 五、条件查询(带比较运算符、带逻辑运算符) 1、带比较运算符的查询 (1) 带 = 运算符的查...
    99+
    2023-09-03
    数据库 mysql 学习
  • MySQL中limit对查询语句性能的影响
    一,前言  首先说明一下MySQL的版本: mysql> select version(); +-----------+ | version() | +...
    99+
    2024-04-02
  • MySQL 根据多字段查询重复数据
    MySQL 根据多字段查询重复数据 在实际的数据库应用中,我们经常需要根据多个字段来查询重复的数据。MySQL 提供了一些方法来实现这个功能,让我们能够快速准确地找到和处理重复数据。本文将介绍如何使用 MySQL 来根据多字段查询重复数据,...
    99+
    2023-09-30
    数据库 oracle
  • mysql 查询数据库所有表,表字段
    工作中,编写xmlsql时需要查询全部字段,可以利用sql快速组装所有的列 查询所有的表名 select table_name,table_comment,auto_increment from information_schem...
    99+
    2023-09-03
    mysql 数据库 sql
  • mysql如何查询所有字段的数据
    这篇文章主要介绍了mysql如何查询所有字段的数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在mysql中...
    99+
    2024-04-02
  • MySQL同时In俩个字段,In多个字段,Mybatis多个In查询问题,Mysql多个IN查询多出数据问题,Mysql多个IN查询 数据准确问题
    背景:                 今天产品验收的时候,导入了大量数据;发现造价项目某个查询列表数据多出了几条数据;看了Mybatis查询,才发现是同时使用了多个IN查询导致的问题;入参是对象列表,In值是分开循环赋值的,问题就出在这里...
    99+
    2023-09-02
    数据库 mysql java
  • mysql创建联合索引时字段的先后顺序,对查询的性能影响多大?
    创建联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,当我们创建联合索引的时候,比如(column1, column2, column3)因为b+树建立索引是从左到右来建立搜索树的,所以(column2...
    99+
    2023-09-21
    sql 数据库
  • mysql如何查询数据库有多少表
    这篇文章主要为大家展示了“mysql如何查询数据库有多少表”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql如何查询数据库有多少表”这篇文章吧。 ...
    99+
    2024-04-02
  • php如何查询数组有多少key值对
    今天小编给大家分享一下php如何查询数组有多少key值对的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在php中,可以利用c...
    99+
    2023-06-29
  • mysql如何查询数据库有多少张表
    这篇文章主要介绍“mysql如何查询数据库有多少张表”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql如何查询数据库有多少张表”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • MySQL中怎么实现单表多字段模糊查询
    今天就跟大家聊聊有关MySQL中怎么实现单表多字段模糊查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  如何实现MySQL单表多字段模糊查询  ...
    99+
    2024-04-02
  • PostgreSQL中不同数据类型对查询性能的影响有哪些
    本篇内容主要讲解“PostgreSQL中不同数据类型对查询性能的影响有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中不同数据类型对查询...
    99+
    2024-04-02
  • 如何查询mysql数据库表字段类型有哪些
    小编给大家分享一下如何查询mysql数据库表字段类型有哪些,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!在mysql数据库中,可以通过DESCRIBE语句来查询数据表的字段类型;该语句能够以表...
    99+
    2024-04-02
  • PHP与MySQL索引的读写比例和数据量对查询性能的影响程度
    摘要:索引是用于提高数据库查询性能的重要工具之一。本文通过具体的代码示例,探讨了PHP与MySQL索引的读写比例和数据量对查询性能的影响程度。引言索引是数据库中用于提高查询性能的一种数据结构。在MySQL中,常见的索引类型包括主键索引、唯一...
    99+
    2023-10-21
    MySQL PHP 索引
  • mysql、clickhouse查询数据库所有的表以及字段信息
    mysql查询数据库所有的表以及字段信息 SELECT     table_schema 数据库名,   table_name 表名,   COLUMN_NAME 列名,   COLUMN_TYPE 数据类型,   DATA_TYP...
    99+
    2023-09-29
    数据库 sql mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作