MySQL5.7虚拟列实现表达式索引_MySQL
MySQL自古以来就不提供函数索引这么复杂的功能。那怎么在MySQL里面实现这样的功能呢? 我们先来看看函数索引的概念。函数索引,也可称为表达式索引,也就是基于字段以特定函数(表达式)建立索引来提升查询性能之需。函数索引的优势在于更加精确的获取所需要的数据。
MySQL 5.7提供了一个新的特性,虚拟列,可以很完美的解决这个问题。
在介绍虚拟列之前,我们来看看在MySQL里面普通索引的范例。
示例表结构:
CREATE TABLE t1 (id INT ,rank INT, log_time DATETIME, nickname VARCHAR(64)) ENGINE INNODB; ALTER TABLE t1 ADD PRIMARY KEY (id), ADD KEY idx_rank (rank),ADD KEY idx_log_time (log_time);
示例表数据量,这里我增加了5000条记录:
mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 5000 | +----------+ 1 row in set (0.00 sec)
假设我们来检索2015年4月9号的数据。(结果是有两条记录,id 分别为95和3423。)
mysql> SELECT * FROM t1 WHERE DATE(log_time) = '2015-04-09'\G *************************** 1. row *************************** id: 95 rank: 24 log_time: 2015-04-09 05:53:13 nickname: test *************************** 2. row *************************** id: 3423 rank: 42 log_time: 2015-04-09 02:55:38 nickname: test 2 rows in set (0.01 sec)
下来我们看看这条语句的查询计划。
mysql> explain SELECT * FROM t1 WHERE DATE(log_time) = '2015-04-09'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 5000 filtered: 100.00 Extra: Using where 1 row in set, 1 warning (0.00 sec)
我们发现TYPE是ALL,扫描的函数是5000,也就是说这条语句进行了一个全表扫描。 虽然给字段log_time 加了索引,但是没有用到,那这个时候怎么办?
在MySQL里面一般这样修改:
mysql> SELECT * FROM t1 WHERE log_time >= '2015-04-09 00:00:00' AND log_time <='2015-04-10 00:00:00'\G *************************** 1. row *************************** id: 3423 rank: 42 log_time: 2015-04-09 02:55:38 nickname: test *************************** 2. row *************************** id: 95 rank: 24 log_time: 2015-04-09 05:53:13 nickname: test 2 rows in set (0.00 sec)
通过查询结果,发现结果集一致,那再来看看查询计划
mysql> explain SELECT * FROM t1 WHERE log_time >= '2015-04-09 00:00:00' AND log_time <= '2015-04-10 00:00:00'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: range possible_keys: idx_log_time key: idx_log_time key_len: 6 ref: NULL rows: 2 filtered: 100.00 Extra: Using index condition 1 row in set, 1 warning (0.00 sec)
可以看到这条修改过的语句很好的利用到了idx_log_time这条索引。
那好,这个是之前在MySQL 5.6以及之前的旧版本解决方法,随着MySQL 5.7的发布,虚拟列的出现让这个问题更加简单。
现在修改下之前的表结构:
ALTER TABLE t1 ADD COLUMN log_date DATE AS (DATE(log_Time)) stored, ADD KEY idx_log_date (log_date);
这样,增加了一新列,用来存放date(log_time)这个表达式,并且给他加了一列索引。
那么,之前的语句就变成如下:
mysql> SELECT * FROM t1 WHERE log_date = '2015-04-09'\G *************************** 1. row *************************** id: 95 rank: 24 log_time: 2015-04-09 05:53:13 nickname: test log_date: 2015-04-09 *************************** 2. row *************************** id: 3423 rank: 42 log_time: 2015-04-09 02:55:38 nickname: test log_date: 2015-04-09 2 rows in set (0.00 sec)
执行后结果集和之前的一致。
我们来看看查询计划,发现很好的利用了idx_log_date索引列。
mysql> explain SELECT * FROM t1 WHERE log_date = '2015-04-09'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ref possible_keys: idx_log_date key: idx_log_date key_len: 4 ref: const rows: 2 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.00 sec)
通过以上介绍,我们看到虚拟列实现起来相对之前的方法来的容易的多。但是这里笔者还是得说上几句。
函数索引的用法以及SQL语句虽然写起来简单,但是在大部分场合下,只能说不得已而为之,是一种设计上的缺陷,后期增加了运维人员的运维难度以及繁琐度。这也就是为什么MySQL 直到5.7才推出了这项类似的功能的原因。

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











Windows 11에서 100% 디스크 사용량을 수정하는 방법 100% 디스크 사용량을 유발하는 문제가 있는 응용 프로그램이나 서비스를 찾는 간단한 방법은 작업 관리자를 사용하는 것입니다. 작업 관리자를 열려면 시작 메뉴를 마우스 오른쪽 버튼으로 클릭하고 작업 관리자를 선택합니다. 가장 많은 리소스를 사용하는 항목을 보려면 디스크 열 헤더를 클릭하세요. 거기에서 어디서부터 시작해야 할지에 대한 좋은 아이디어를 갖게 될 것입니다. 그러나 문제는 단순히 애플리케이션을 닫거나 서비스를 비활성화하는 것보다 더 심각할 수 있습니다. 문제의 잠재적인 원인과 해결 방법을 알아보려면 계속 읽어보세요. SuperfetchSuperfetch 기능(Windows 11에서는 SysMain이라고도 함)을 비활성화하면 프리페치 파일에 액세스하여 시작 시간을 줄이는 데 도움이 됩니다.

<h2>Windows 11 검색에서 파일 및 폴더를 숨기는 방법</h2><p>가장 먼저 살펴봐야 할 것은 Windows 검색 파일의 위치를 사용자 지정하는 것입니다. 이러한 특정 위치를 건너뛰면 보호하려는 파일을 숨기는 동시에 결과를 더 빨리 볼 수 있습니다. </p><p>Windows 11 검색에서 파일과 폴더를 제외하려면 다음 단계를 따르세요. </p><ol&

Windows 11에서 검색 창이 작동하지 않는 경우 즉시 검색 창을 활성화하고 실행할 수 있는 몇 가지 빠른 방법이 있습니다! 모든 Microsoft 운영 체제에서는 때때로 결함이 발생할 수 있으며 최신 운영 체제도 이 규칙에서 면제되지 않습니다. 또한 Reddit의 u/zebra_head1 사용자가 지적한 대로 22H2Build22621.1413이 포함된 Windows 11에서도 동일한 오류가 나타납니다. 사용자들은 작업 표시줄 검색 상자를 무작위로 전환하는 옵션이 사라졌다고 불평했습니다. 그러므로 어떤 상황에도 대비해야 합니다. 내 컴퓨터의 검색창에 입력할 수 없는 이유는 무엇입니까? 컴퓨터에 입력할 수 없는 현상은 다양한 요인과 프로세스로 인해 발생할 수 있습니다. 주의해야 할 사항은 다음과 같습니다. Ctfmon.

Oracle 인덱스 유형은 다음과 같습니다. 1. B-트리 인덱스, 3. 함수 인덱스, 5. 역방향 키 인덱스, 7. 도메인 인덱스, 비트맵 연결 인덱스 10. 복합 인덱스. 세부 소개: 1. B-트리 인덱스는 동시 작업을 효율적으로 지원할 수 있는 자체 균형 트리 데이터 구조입니다. Oracle 데이터베이스에서 B-트리 인덱스는 가장 일반적으로 사용되는 인덱스 유형입니다. 2. 비트 그래프 인덱스는 인덱스 유형 기반입니다. 비트맵 알고리즘 등에 관한 것입니다.

Outlook에서 검색 및 인덱싱 문제 해결사 실행 시작할 수 있는 보다 간단한 해결 방법 중 하나는 검색 및 인덱싱 문제 해결사를 실행하는 것입니다. Windows 11에서 문제 해결사를 실행하려면: 시작 버튼을 클릭하거나 Windows 키를 누르고 메뉴에서 설정을 선택합니다. 설정이 열리면 시스템 > 문제 해결 > 추가 문제 해결을 선택합니다. 오른쪽에서 아래로 스크롤하여 SearchandIndexing을 찾아 실행 버튼을 클릭하세요. 결과를 반환하지 않으려면 Outlook 검색을 선택하고 화면 지침을 계속 진행합니다. 실행하면 문제 해결사가 자동으로 문제를 식별하고 해결합니다. 문제 해결사를 실행한 후 Outlook을 열고 검색이 제대로 작동하는지 확인하세요. 좋다

해결 방법은 다음과 같습니다. 1. 인덱스 값이 올바른지 확인합니다. 먼저 인덱스 값이 배열의 길이 범위를 초과하는지 확인합니다. 배열의 인덱스는 0부터 시작하므로 최대 인덱스 값은 배열 길이에서 1을 뺀 값이어야 합니다. 2. 루프 경계 조건을 확인하세요. 루프에서 배열 액세스에 인덱스를 사용하는 경우 루프 경계 조건이 올바른지 확인하세요. 3. 배열 초기화: 배열을 사용하기 전에 배열이 올바르게 초기화되었는지 확인하십시오. 4. 예외 처리 사용: 프로그램의 예외 처리 메커니즘을 사용하여 인덱스가 배열 범위를 초과하는 오류를 잡을 수 있습니다. 그에 따라 처리하십시오.

이 글은 PHP가 다른 문자열에서 문자열의 시작 위치부터 끝 위치까지 문자열을 반환하는 방법을 자세히 설명합니다. 편집자는 이것이 꽤 실용적이라고 생각하므로 참고용으로 공유하겠습니다. 이 기사에서 뭔가를 얻을 수 있습니다. PHP에서 substr() 함수를 사용하여 문자열에서 부분 문자열을 추출합니다. substr() 함수는 문자열에서 지정된 범위 내의 문자를 추출할 수 있습니다. 구문은 다음과 같습니다. substr(string,start,length) 여기서: string: 하위 문자열을 추출할 원래 문자열입니다. start: 하위 문자열의 시작 위치에 대한 인덱스입니다(0부터 시작). 길이(선택 사항): 하위 문자열의 길이입니다. 지정하지 않은 경우

인덱스를 통해 PHP 및 MySQL에서 데이터 그룹화 및 데이터 집계의 효율성을 향상시키는 방법은 무엇입니까? 소개: PHP와 MySQL은 현재 가장 널리 사용되는 프로그래밍 언어이자 데이터베이스 관리 시스템으로, 웹 애플리케이션을 구축하고 대용량 데이터를 처리하는 데 자주 사용됩니다. 데이터 그룹화 및 데이터 집계는 대용량 데이터를 처리할 때 흔히 수행되는 작업이지만, 인덱스를 적절하게 설계하고 사용하지 않으면 이러한 작업은 매우 비효율적일 수 있습니다. 이 기사에서는 인덱스를 사용하여 PHP 및 MySQL에서 데이터 그룹화 및 데이터 집계의 효율성을 향상시키는 방법을 소개하고,
