>데이터 베이스 >MySQL 튜토리얼 >쉼표로 구분된 값이 있는 테이블에 대한 SQL 쿼리를 최적화하는 방법은 무엇입니까?

쉼표로 구분된 값이 있는 테이블에 대한 SQL 쿼리를 최적화하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-18 00:24:11455검색

How to Optimize SQL Queries for Tables with Comma-Separated Values?

쉼표로 구분된 열 값이 있는 테이블에 대한 SQL 쿼리 최적화

열에 쉼표로 구분된 값이 포함된 테이블을 처리할 때 특정 실행 쿼리는 어려울 수 있습니다. 일반적인 시나리오는 쉼표로 구분된 열 내에서 특정 값을 검색할 때 모든 관련 데이터를 검색하는 것입니다.

문제:

특정 항목과 연결된 모든 사용자 이름을 검색해야 합니다. 쉼표로 구분된 열의 ​​값입니다. 예를 들어, 아래 테이블 구조에서 다음을 검색할 때 모든 사용자 이름을 찾으려고 합니다. "new1."

테이블:

CREATE TABLE tblA
(
id int NOT NULL AUTO_INCREMENT ,
user varchar(255),
category int(255),
PRIMARY KEY (id)
);

CREATE TABLE tblB
(
id int NOT NULL AUTO_INCREMENT ,
username varchar(255),
userid int(255),
PRIMARY KEY (id)
);

CREATE TABLE tblC
(
id int NOT NULL AUTO_INCREMENT ,
nname varchar(255),
userids varchar(255),
PRIMARY KEY (id)
);

INSERT INTO tblA (user, category ) VALUES
('1', '1'),
('1', '2'),
('1', '3'),
('1', '1'),
('2', '1'),
('2', '1'),
('2', '1'),
('2', '1'),
('3', '1'),
('2', '1'),
('4', '1'),
('4', '1'),
('2', '1');


INSERT INTO tblB (userid, username ) VALUES
('1', 'A'),
('2', 'B'),
('3', 'C'),
('4', 'D'),
('5', 'E');


INSERT INTO tblC (id, nname,userids ) VALUES
('1', 'new1','1,2'),
('2', 'new2','1,3'),
('3', 'new3','1,4'),
('4', 'new4','3,2'),
('5', 'new5','5,2');

쿼리:

select * where nname="new1" from  tblC
CROSS JOIN tblB
ON tblB.userid=(SELECT userids FROM substr(tblC.userids,','))

제한 사항:

이 쿼리는 SUBSTR 및 FIND_IN_SET 함수를 사용합니다. 대규모 데이터 세트에는 비효율적입니다. 또한 행당 하나의 쉼표로 구분된 값만 가정하지만 항상 그런 것은 아닙니다.

권장 솔루션:

데이터베이스 정규화:

쉼표로 구분된 별도의 테이블을 생성하여 데이터베이스 스키마를 정규화하세요. 가치. 이는 문자열을 통한 검색의 비효율성을 제거하고 쿼리를 단순화합니다.

예시 스키마:

CREATE TABLE tblC (
id int NOT NULL AUTO_INCREMENT ,
nname varchar(255),
PRIMARY KEY (id)
);

CREATE TABLE tblC_user (
c_id int NOT NULL,
userid int NOT NULL
);

INSERT INTO tblC (id, nname) VALUES
('1', 'new1'),
('2', 'new2'),
('3', 'new3'),
('4', 'new4'),
('5', 'new5');

INSERT INTO tblC_user (c_id, userid) VALUES
('1','1'),
('1','2'),
('2','1'),
('2','3'),
('3','1'),
('3','4'),
('4','3'),
('4','2'),
('5','5'),
('5','2');

최적화됨 쿼리:

select *
from tblC c
join tblC_user cu on(c.id = cu.c_id)
join tblB b on (b.userid = cu.userid)
where c.nname="new1"

이점:

  • 효율적인 조인 작업으로 성능 향상
  • 문자열 조작을 제거하여 복잡성 감소 기능
  • 향후 변화를 수용할 수 있는 유지보수성과 유연성 데이터 구조에

위 내용은 쉼표로 구분된 값이 있는 테이블에 대한 SQL 쿼리를 최적화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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