목차
1. 인덱스 생성에 적합
1. 필드 값에는 고유성 제한이 있습니다.
2. Where 쿼리 조건으로 자주 사용되는 필드
3. Group by 및 Order by
4. 업데이트 및 삭제의 where 조건 열
5. 고유 필드는 인덱스를 생성해야 합니다.
6. 다중 테이블 Join 연결 작업 중 인덱스 생성 시 주의 사항
7、使用列的类型小的创建索引
8、使用字符串前缀创建索引
9、区分度高的列适合作为索引
10、使用最频繁的列放到联合索引的左侧
11、在多个字段都要创建索引的情况下,联合索引由于单值索引
二、不适合创建索引
1、在where中使用不到的字段不要设置索引
2、数据量小的表最好不要使用索引
3、有大量重复数据的列上不要建立索引
5、不建议用无序的值作为索引
8、删除不在使用或很少使用的索引
7、不要定义冗余或重复的索引
9. 중복되거나 중복된 인덱스를 정의하지 마세요
데이터 베이스 MySQL 튜토리얼 MySQL 인덱스 생성 원리 분석 예시

MySQL 인덱스 생성 원리 분석 예시

Apr 17, 2023 pm 05:01 PM
mysql

    1. 인덱스 생성에 적합

    1. 필드 값에는 고유성 제한이 있습니다.

    Alibaba 사양에 따르면 비즈니스에서 고유한 특성을 갖는 필드는 결합된 필드라도 고유한 인덱스로 구축되어야 합니다.

    MySQL 인덱스 생성 원리 분석 예시

    예를 들어 학생 테이블의 학생 번호는 고유한 필드입니다. 이 필드에 대한 고유 인덱스를 생성하면 해당 이름이 사용되는 경우 특정 학생의 정보를 빠르게 쿼리할 수 있습니다. 이름을 지정하므로 쿼리 속도가 느려집니다.

    2. Where 쿼리 조건으로 자주 사용되는 필드

    Select 문의 Where 조건에서 필드가 자주 사용되는 경우, 특히 데이터 양이 많은 경우 해당 필드에 대한 인덱스를 생성해야 합니다. , 일반 인덱스를 만드는 것만으로도 쿼리 효율성을 크게 향상시킬 수 있습니다.

    예를 들어, Student_info에 100만 개의 데이터가 있다고 가정하면, Student_id=112322라는 사용자 정보를 쿼리한다고 가정하면, Student_id 필드에 인덱스가 생성되지 않으면 쿼리 결과는 다음과 같습니다.

    select course_id, class_id, name, create_time,student_id from student_info where student_id = 112322;# 花费211ms
    로그인 후 복사

    MySQL 인덱스 생성 원리 분석 예시

    After Student_id에 대한 인덱스를 생성하면 쿼리 결과는 다음과 같습니다:

    alter table student_info add index idx_sid(student_id);
    select course_id, class_id, name, create_time,student_id from student_info where student_id = 112322;# 花费3ms
    로그인 후 복사

    MySQL 인덱스 생성 원리 분석 예시

    3. Group by 및 Order by

    인덱스 열을 사용하면 특정 순서로 데이터를 저장하거나 검색할 수 있으므로 Group by를 사용할 때 데이터를 그룹화하거나 정렬 기준을 사용하여 데이터를 정렬하려면 그룹화 또는 정렬 필드를 색인화해야 합니다. 정렬할 열이 여러 개인 경우 이러한 열에 결합된 인덱스를 작성할 수 있습니다.

    예를 들어, Student_id에 따라 학생들이 선택한 강좌를 그룹화하고, 서로 다른 Student_id와 강좌 수를 표시하고, 100개의 항목을 표시합니다. Student_id에 대한 인덱스를 생성하지 않은 경우 쿼리 결과는 다음과 같습니다.

    select student_id,count(*) as num from student_info group by student_id limit 100;#花费2.466s
    로그인 후 복사

    MySQL 인덱스 생성 원리 분석 예시

    student_id에 대한 인덱스를 생성한 후 쿼리 결과는 다음과 같습니다.

    alter table student_info add index idx_sid(student_id);
    select student_id,count(*) as num from student_info group by student_id limit 100;#花费6ms
    로그인 후 복사

    MySQL 인덱스 생성 원리 분석 예시

    둘을 모두 포함하는 쿼리 문의 경우 group by 및 order by의 경우에는 Joint 인덱스를 생성하고 "가장 왼쪽 접두사 일치 원칙"을 충족하기 위해 order by 필드 앞에 필드를 group by로 배치하여 인덱스 활용률을 높이는 것이 좋습니다. 동시에 자연 쿼리 효율성도 높아집니다. 8.0 이후 버전에서는 내림차순 인덱스를 지원합니다. order by 이후의 필드가 내림차순으로 되어 있는 경우 직접 내림차순 인덱스를 생성하는 것도 고려해 볼 수 있으며 이는 쿼리 효율성도 향상시킵니다.

    4. 업데이트 및 삭제의 where 조건 열

    특정 조건에 따라 데이터를 쿼리한 후 업데이트 또는 삭제 작업을 수행합니다. Where 필드에 대해 인덱스가 생성되면 응답이 향상되어 효율성이 향상될 수 있습니다. . 그 이유는 이 레코드를 Where 조건 열을 기준으로 먼저 검색한 후 업데이트하거나 삭제해야 하기 때문입니다. 업데이트 시 업데이트된 필드가 인덱스가 아닌 필드인 경우 인덱스 필드 업데이트에 유지 관리가 필요하지 않기 때문에 효율성 향상이 더욱 분명해집니다.

    예를 들어, Student_info 테이블의 name 필드가 sdfasdfas123123이라면, Student_id는 110119로 수정됩니다. name 필드를 인덱싱하지 않은 경우 실행 상황은 다음과 같습니다.

    update student_info set student_id = 110119 where name = 'sdfasdfas123123';#花费549ms
    로그인 후 복사

    MySQL 인덱스 생성 원리 분석 예시

    인덱스 추가 후 실행 상황

    alter table student_info add index idx_name(name);
    update student_info set student_id = 110119 where name = 'sdfasdfas123123';#花费2ms
    로그인 후 복사

    MySQL 인덱스 생성 원리 분석 예시

    5. 고유 필드는 인덱스를 생성해야 합니다.

    특정 필드를 중복 제거해야 하는 경우도 있습니다. 이 필드에 대한 인덱스를 생성하면 쿼리 효율성도 향상됩니다.

    예를 들어, 강좌 일정에서 서로 다른 Student_id를 쿼리합니다. Student_id에 대한 인덱스가 생성되지 않은 경우 실행 상황은 다음과 같습니다.

    select distinct(student_id) from student_id;#花费2ms
    로그인 후 복사

    MySQL 인덱스 생성 원리 분석 예시

    인덱스 생성 후 실행 상황은 다음과 같습니다.

    alter table student_info add index idx_sid(student_id);
    select distinct(student_id) from student_id;#花费0.1ms
    로그인 후 복사

    6. 다중 테이블 Join 연결 작업 중 인덱스 생성 시 주의 사항

    우선 연결 테이블의 데이터 양은 3개를 초과해서는 안 됩니다. 각 추가 테이블은 중첩 루프를 추가하는 것과 동일하며, 규모가 매우 빠르게 증가하여 쿼리 효율성에 심각한 영향을 미칩니다. 둘째, Where 조건에 대한 인덱스를 생성합니다. 왜냐하면 Where는 데이터 조건에 대한 필터이기 때문입니다. 데이터의 양이 매우 많으면 필터링을 위한 Where 조건이 없으면 매우 무서울 것입니다. 필드를 다시 변경하고 여러 테이블의 유형이 일관되어야 합니다.

    MySQL 인덱스 생성 원리 분석 예시

    예를 들어, Student_id에 대해서만 인덱스를 생성하면 쿼리 결과는 다음과 같습니다.

    select course_id, name, student_info.student_id,course_name
    from student_info join course
    on student_info.course_id = course.course_id
    where name = 'aAAaAA'; #花费176ms
    로그인 후 복사

    MySQL 인덱스 생성 원리 분석 예시

    이름 필드에 대한 인덱스를 생성한 후 쿼리 결과는 다음과 같습니다.

    alter table student_info add index idx_name(name);
    select course_id, name, student_info.student_id,course_name
    from student_info join course
    on student_info.course_id = course.course_id
    where name = 'aAAaAA'; #花费2ms
    로그인 후 복사

    MySQL 인덱스 생성 원리 분석 예시

    7、使用列的类型小的创建索引

    这里所说的类型小值意思是该类型表示的数据范围的大小。比如在定义表结构的时候要显示的指定列的类型,以整数类型为例,有TINYINT、MEDIUMINT、INT、BIGINT等,他们占用的存储空间依次递增,能表示的数据范围也是一次递增。如果相对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,例如能使用INT不要使用BIGINT,能使用MEDIUMINT不使用INT,原因如下:

    • 数据类型越小,在查询时进行的比较操作越快

    • 数据类型越小,索引占用的空间就越少,在一个数据页内就可以存下更多的记录,从而减少磁盘I/O带来的性能损耗,也就意味着可以存储更多的数据在数据页中,提高读写效率。

    上述对于主键来说很合适,因为在聚簇索引中既存储了数据,也存储了索引,可以很好的减少磁盘I/O;而对于二级索引来说,还需要一次回表操作才能查到完整的数据,也就能加了一次磁盘I/O。

    8、使用字符串前缀创建索引

    根据Alibaba开发手册,在字符串上建立索引时,必须指定索引长度,没有必要对全字段建立索引。

    MySQL 인덱스 생성 원리 분석 예시

    比如有一张商品表,表中的商品描述字段较长,在描述字段上建立前缀索引如下:

    create table product(id int, desc varchar(120) not null);
    alter table product add index(desc(12));
    로그인 후 복사

    区分度的计算可以使用count(distinct left(列名, 索引长度))/count(*)来确定。

    9、区分度高的列适合作为索引

    列的基数值得时某一列中不重复数据的个数,比如说某个列包含值2,5,3,6,2,7,2,虽然有7条记录,但该列的基数却是5,也就是说,在记录行数一定的情况下,列的基数越大,该列中的值就越分散;列的基数越小,该列中的值就越集中。这里列的基数指标非常重要,直接影响是否能有效利用索引。最好为列的基数大的列建立索引,为基数太小的列建立索引效果反而不好。

    可以使用公式select count(distinct col)/count(*) from table 来计算区分度,越接近1区分度越好。

    10、使用最频繁的列放到联合索引的左侧

    这条就是通常说的最左前缀匹配原则。 通俗来讲就是将Where条件后经常使用的条件字段放在索引的最左边,将使用频率相对低的放到右边。

    11、在多个字段都要创建索引的情况下,联合索引由于单值索引

    二、不适合创建索引

    1、在where中使用不到的字段不要设置索引

    通常索引的建立是有代价的,如果建立索引的字段没有出现在where条件(包括group by、order by)中,建议一开始就不要创建索引或将索引删除,因为索引的存在也会占用空间。

    2、数据量小的表最好不要使用索引

    3、有大量重复数据的列上不要建立索引

    在条件表达式中经常用到的不同值较多的列上建立索引,但字段中如果有大量重复数据,也不用创建索引。比如学生表中的性别字段,只有男和女两种值,因此无需建立索引。如果建立索引,不但不会提高查询效率,反而会严重降低数据更新速度。

    4、避免对经常更新的表创建过多的索引

    • 频繁更新的字段不一定要创建索引,因为更新数据的时候,索引也要跟着更新,如果索引太多,更新的时候会造成服务器压力,从而影响效率。

    • 避免对经常更新的表创建过多的索引,并且索引中的列尽可能少。此时虽然提高了查询速度,同时也会降低更新表的速度。

    5、不建议用无序的值作为索引

    例如身份证、UUID(在索引比较时需要转为ASCII,并且插入时可能造成页分裂)、MD5、HASH、无序长字符串等。

    6、删除不在使用或很少使用的索引

    表中的数据被大量更新或者数据的使用方式被改变后,原有的一些索引可能不会被使用到。DBA应定期找出这些索引并将之删除,从而较少无用索引对更新操作的影响。

    7、不要定义冗余或重复的索引

    例如身份证、UUID(在索引比较时需要转为ASCII,并且插入时可能造成页分裂)、MD5、HASH、无序长字符串等。

    8、删除不在使用或很少使用的索引

    表中的数据被大量更新或者数据的使用方式被改变后,原有的一些索引可能不会被使用到。DBA应定期找出这些索引并将之删除,从而较少无用索引对更新操作的影响。

    9. 중복되거나 중복된 인덱스를 정의하지 마세요

    위 내용은 MySQL 인덱스 생성 원리 분석 예시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    메모장++7.3.1

    메모장++7.3.1

    사용하기 쉬운 무료 코드 편집기

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.

    스튜디오 13.0.1 보내기

    스튜디오 13.0.1 보내기

    강력한 PHP 통합 개발 환경

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    SublimeText3 Mac 버전

    SublimeText3 Mac 버전

    신 수준의 코드 편집 소프트웨어(SublimeText3)

    MySQL : 초보자를위한 데이터 관리의 용이성 MySQL : 초보자를위한 데이터 관리의 용이성 Apr 09, 2025 am 12:07 AM

    MySQL은 설치가 간단하고 강력하며 데이터를 쉽게 관리하기 쉽기 때문에 초보자에게 적합합니다. 1. 다양한 운영 체제에 적합한 간단한 설치 및 구성. 2. 데이터베이스 및 테이블 작성, 삽입, 쿼리, 업데이트 및 삭제와 같은 기본 작업을 지원합니다. 3. 조인 작업 및 하위 쿼리와 같은 고급 기능을 제공합니다. 4. 인덱싱, 쿼리 최적화 및 테이블 파티셔닝을 통해 성능을 향상시킬 수 있습니다. 5. 데이터 보안 및 일관성을 보장하기위한 지원 백업, 복구 및 보안 조치.

    Navicat에서 데이터베이스 비밀번호를 검색 할 수 있습니까? Navicat에서 데이터베이스 비밀번호를 검색 할 수 있습니까? Apr 08, 2025 pm 09:51 PM

    Navicat 자체는 데이터베이스 비밀번호를 저장하지 않으며 암호화 된 암호 만 검색 할 수 있습니다. 솔루션 : 1. 비밀번호 관리자를 확인하십시오. 2. Navicat의 "비밀번호 기억"기능을 확인하십시오. 3. 데이터베이스 비밀번호를 재설정합니다. 4. 데이터베이스 관리자에게 문의하십시오.

    Navicat Premium을 만드는 방법 Navicat Premium을 만드는 방법 Apr 09, 2025 am 07:09 AM

    Navicat Premium을 사용하여 데이터베이스 생성 : 데이터베이스 서버에 연결하고 연결 매개 변수를 입력하십시오. 서버를 마우스 오른쪽 버튼으로 클릭하고 데이터베이스 생성을 선택하십시오. 새 데이터베이스의 이름과 지정된 문자 세트 및 Collation의 이름을 입력하십시오. 새 데이터베이스에 연결하고 객체 브라우저에서 테이블을 만듭니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 데이터 삽입을 선택하여 데이터를 삽입하십시오.

    MySQL : 쉽게 학습하기위한 간단한 개념 MySQL : 쉽게 학습하기위한 간단한 개념 Apr 10, 2025 am 09:29 AM

    MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오.

    MariaDB 용 Navicat에서 데이터베이스 비밀번호를 보는 방법은 무엇입니까? MariaDB 용 Navicat에서 데이터베이스 비밀번호를 보는 방법은 무엇입니까? Apr 08, 2025 pm 09:18 PM

    MariaDB 용 Navicat은 암호가 암호화 된 양식으로 저장되므로 데이터베이스 비밀번호를 직접 볼 수 없습니다. 데이터베이스 보안을 보장하려면 비밀번호를 재설정하는 세 가지 방법이 있습니다. Navicat을 통해 비밀번호를 재설정하고 복잡한 비밀번호를 설정하십시오. 구성 파일을 봅니다 (권장되지 않음, 위험이 높음). 시스템 명령 줄 도구를 사용하십시오 (권장되지 않으면 명령 줄 도구에 능숙해야 함).

    Navicat에서 MySQL에 새로운 연결을 만드는 방법 Navicat에서 MySQL에 새로운 연결을 만드는 방법 Apr 09, 2025 am 07:21 AM

    응용 프로그램을 열고 새로운 연결 (Ctrl n)을 선택하여 Navicat에서 새로운 MySQL 연결을 만들 수 있습니다. "MySQL"을 연결 유형으로 선택하십시오. 호스트 이름/IP 주소, 포트, 사용자 이름 및 비밀번호를 입력하십시오. (선택 사항) 고급 옵션을 구성합니다. 연결을 저장하고 연결 이름을 입력하십시오.

    Navicat은 데이터베이스 오류 코드 및 솔루션에 연결합니다 Navicat은 데이터베이스 오류 코드 및 솔루션에 연결합니다 Apr 08, 2025 pm 11:06 PM

    데이터베이스에 연결할 때의 일반적인 오류 및 솔루션 : 사용자 이름 또는 비밀번호 (오류 1045) 방화벽 차단 연결 (오류 2003) 연결 시간 초과 (오류 10060) 소켓 연결 (오류 1042) SSL 연결 오류 (오류 10055) 너무 많은 연결 시도가 차단되는 경우 (오류 1049) 데이터베이스에 연결되지 않음 (오류 1049) 데이터베이스에 연결되지 않습니다 (오류 1049).

    Navicat에서 SQL을 실행하는 방법 Navicat에서 SQL을 실행하는 방법 Apr 08, 2025 pm 11:42 PM

    Navicat에서 SQL을 수행하는 단계 : 데이터베이스에 연결하십시오. SQL 편집기 창을 만듭니다. SQL 쿼리 또는 스크립트를 작성하십시오. 실행 버튼을 클릭하여 쿼리 또는 스크립트를 실행하십시오. 결과를 봅니다 (쿼리가 실행 된 경우).

    See all articles