iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中如何使用多列索引
  • 770
分享到

MySQL中如何使用多列索引

2024-04-02 19:04:59 770人浏览 泡泡鱼
摘要

Mysql中如何使用多列索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。多列索引我们经常听到一些人说"把WHERE条件里的

Mysql中如何使用多列索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

多列索引

我们经常听到一些人说"把WHERE条件里的列都加上索引",其实这个建议非常错误。在多个列上建立单独的索引大部分情况下并不能提高mysql的查询性能。Mysql在5.0之后引入了一种叫“索引合并”(index  merge)的策略,一定程度上可以使用表上的多个单列索引来定位指定的行。但是当服务器对多个索引做联合操作时,通常需要耗费大量CPU和内存资源在算法缓存排序和合并操作上,特别是当其中有些索引的选择性不高,需要合并扫描大量的数据的时候。

这个时候,我们需要一个多列索引。

案例

创建一个测试数据库和数据表:

CREATE DATABASE IF NOT EXISTS db_test default charset utf8 COLLATE utf8_general_ci;  use db_test; CREATE TABLE payment (       id         INT UNSIGNED NOT NULL AUTO_INCREMENT,       staff_id  INT UNSIGNED NOT NULL,       customer_id INT UNSIGNED NOT NULL,       PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入1000w行随机数据(利用存储过程):

DROP PROCEDURE IF EXISTS add_payment;   DELIMITER //     create PROCEDURE add_payment(in num INT)     BEGIN         DECLARE rowid INT DEFAULT 0;         SET @exesql = 'INSERT INTO payment(staff_id, customer_id) values (?, ?)';         WHILE rowid < num DO             SET @staff_id = (1 + FLOOR(5000*RAND()) );              SET @customer_id = (1 + FLOOR(500000*RAND()));             SET rowid = rowid + 1;             prepare stmt FROM @exesql;             EXECUTE stmt USING @staff_id, @customer_id;                     END WHILE;     END // DELIMITER ;

或者你可以直接下载使用我的测试数据(也是利用上面的存储过程,但是我之后调整了数据):

测试数据

添加两个单列索引(执行过程要花点时间,建议分开一句一句执行):

ALTER TABLE `payment` ADD INDEX idx_customer_id(`customer_id`);  ALTER TABLE `payment` ADD INDEX idx_staff_id(`staff_id`);

查询一条数据利用到两个列的索引:

select count(*) from payment where staff_id = 2205 AND customer_id = 93112;

查看执行计划:

mysql> explain select count(*)  from payment  where staff_id =  2205  AND customer_id =  93112; +----+-------------+---------+-------------+------------------------------+------------------------------+---------+------+-------+-------------------------------------------------------------------------+ | id | select_type | table   | type        | possible_keys                | key                          | key_len | ref  | rows  | Extra                                                                   | +----+-------------+---------+-------------+------------------------------+------------------------------+---------+------+-------+-------------------------------------------------------------------------+ |  1 | SIMPLE      | payment | index_merge | idx_customer_id,idx_staff_id | idx_staff_id,idx_customer_id | 4,4     | NULL | 11711 | Using intersect(idx_staff_id,idx_customer_id); Using where; Using index | +----+-------------+---------+-------------+------------------------------+------------------------------+---------+------+-------+-------------------------------------------------------------------------+ 1 row in set (0.00 sec)

可以看到type是index_merge,Extra中提示Using  intersect(idx_staff_id,idx_customer_id);

这便是索引合并,利用两个索引,然后合并两个结果(取交集或者并集或者两者都有)

查询结果:

mysql> select count(*)  from payment  where staff_id =  2205  AND customer_id =  93112 ; +----------+ | count(*) | +----------+ |   178770 | +----------+ 1 row in set (0.12 sec)

然后删除以上索引,添加多列索引:

ALTER TABLE payment DROP INDEX idx_customer_id;  ALTER TABLE payment DROP INDEX idx_staff_id;  ALTER TABLE `payment` ADD INDEX idx_customer_id_staff_id(`customer_id`, `staff_id`);

注意,多列索引很关注索引列的顺序(因为customer_id的选择性更大,所以把它放前面)

查询:

mysql> select count(*)  from payment  where staff_id =  2205  AND customer_id =  93112; +----------+ | count(*) | +----------+ |   178770 | +----------+ 1 row in set (0.05 sec)

发现多列索引加快的查询(这里数据量还是较小,更大的时候比较更明显)

注意

多列索引的列顺序至关重要,如何选择索引的列顺序有一个经验法则:将选择性***的列放到索引最前列(但是不是绝对的)。经验法则考虑全局的基数和选择性,而不是某个具体的查询:

mysql> select count(DISTINCT staff_id) / count(*) AS staff_id_selectivity, count(DISTINCT customer_id) / count(*) AS customer_id_selectivity, count(*) from payment\G; *************************** 1. row ***************************    staff_id_selectivity: 0.0005 customer_id_selectivity: 0.0500                count(*): 10000000 1 row in set (6.29 sec)

customer_id的选择性更高,所以将它作为索引列的***位。

多列索引只能匹配最左前缀,也就是说:

select * from payment  where staff_id =  2205  AND customer_id =  93112 ; select count(*)  from payment  where  customer_id =  93112 ;

可以利用索引,但是

select * from payment where staff_id = 2205 ;

看完上述内容,你们掌握MySQL中如何使用多列索引的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中如何使用多列索引

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL中如何使用多列索引
    MySQL中如何使用多列索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。多列索引我们经常听到一些人说"把WHERE条件里的...
    99+
    2022-10-18
  • MySQL多列索引怎么用
    这篇文章将为大家详细讲解有关MySQL多列索引怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。    针对此问题进行测试:假设某个表有一...
    99+
    2022-10-18
  • MySQL中单列索引和多列索引的示例分析
    这篇文章主要为大家展示了“MySQL中单列索引和多列索引的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中单列索引和多列索引的示例分析”这篇文...
    99+
    2022-10-18
  • MySQL组合索引(多列索引)使用与优化案例详解
    目录1、多列索引2、测试案例及过程2.1 创建一个测试数据库和数据表2.2 添加两个单列索引2.3 查询一条数据利用到两个列的索引2.4 查看执行计划2.5 然后删除以上索引,添加多列索引2.6 再次查询3、多列索引的使...
    99+
    2022-07-04
    mysql组合索引使用 mysql索引
  • MySQL中如何使用索引
    这篇文章给大家介绍MySQL中如何使用索引,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mysql采用b+树的方式存储索引信息。b+树结构如下:说一下b+树的几个特点:叶子节点(最下面...
    99+
    2022-10-18
  • 如何使用mysql索引
    这篇文章主要为大家展示了如何使用mysql索引,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。什么是索引:索引可以帮助快速查找数据而基本上索引都要求唯一(有些不...
    99+
    2022-10-18
  • mysql索引如何使用
    小编给大家分享一下mysql索引如何使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、索引是什么1.索引简介索引其实是以文件...
    99+
    2022-10-18
  • MySQL如何使用索引
    这篇文章给大家分享的是有关MySQL如何使用索引的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MYSQL的事务配置项 innodb_flush_log_at_trx...
    99+
    2022-10-18
  • MySQL避免索引列使用 OR 条件
    这个亏已经吃过很多次了,在开发以前的sql代码里面,许多以 or 作为where条件的查询,甚至更新。这里举例来说明使用 or 的弊端,以及改进办法。 select f_crm_id fro...
    99+
    2022-05-25
    mysql
  • 我们如何删除多列UNIQUE索引?
    多列 UNIQUE 索引也可以像我们从表中删除 UNIQUE 约束一样被删除。示例在此示例中,我们使用以下查询已删除表“employee”上的多列 UNIQUE 索引 -mysql> DROP index id_fname_l...
    99+
    2023-10-22
  • 我们如何创建多列UNIQUE索引?
    为了创建多列 UNIQUE 索引,我们需要在多个列上指定索引名称。以下示例将在“employee”表的“empid”、“first_name”、“last_name”列上创建名为“id_fname_lname”的多列索引 -mysql>...
    99+
    2023-10-22
  • MySQL中如何利用索引
    MySQL中如何利用索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、前言在MySQL中进行SQL优化的时候,经常会在一些情况下,对M...
    99+
    2022-10-18
  • 如何在mysql中使用哈希索引
    这期内容当中小编将会给大家带来有关如何在mysql中使用哈希索引,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、Hash索引应进行二次搜索。使用哈希索引两次搜索,第一次找到相应的行,第二次读取数据,但频...
    99+
    2023-06-15
  • Mysql如何使用索引排序
    在mysql中使用索引排序的方法首先,在命令行中启动MySQL服务;service mysql start  MySQL服务启动后,在命令行中输入mysql的用户名和密码登录到MySQL;mysql -u root -p登录到MySQL后,...
    99+
    2022-10-11
  • 如何使用Python中的列表切片和索引
    如何使用Python中的列表切片和索引列表是Python中常用的数据结构之一,可以存储多个元素。在实际开发中,经常需要对列表进行操作,其中列表切片和索引是非常常用的功能。本文将介绍如何使用Python中的列表切片和索引,并提供具体的代码示例...
    99+
    2023-10-22
    Python 列表 切片和索引
  • MySQL中怎么使用索引
    今天就跟大家聊聊有关MySQL中怎么使用索引,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  MySQL何时使用索引  对一个键码使用>,&g...
    99+
    2022-10-18
  • mysql中in使不使用索引
    今天小编给大家分享一下mysql中in使不使用索引的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2022-10-19
  • mysql多条件查询会使用索引吗
    mysql多条件查询会使用索引,取决因素有:1、索引的选择性,指索引中具有唯一或较小重复值的比例;2、索引的覆盖度,指索引中包含了查询所需的所有列,从而避免了对实际数据行的访问,提高查询性能;3、查询的顺序和条件结合,根据查询的具体情况进行...
    99+
    2023-07-25
  • MySQL多表联查如何建立索引?
    在 MySQL 数据库中,设计索引主要是为了提高查询的效率,降低数据库的压力。当我们进行多表查询时,正确设计索引非常重要。 具体方法与建议: 为连接列创建索引:在多表查询中,连接列通常是性能瓶颈。为这些列创建索引可以显著提高查询性能。考虑表...
    99+
    2023-10-24
    mysql 数据库
  • 怎么在python中使用列表索引
    本篇文章为大家展示了怎么在python中使用列表索引,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作