Olá!
Bom... deixando a disputa de lado e retornando ao assunto do tópico, seguem alguns testes que fiz:
/* SQL para criação de tabela - modo tradicional */
USE test;
DROP TABLE IF EXISTS tbAcoes
CREATE TABLE tbAcoes (
codigo INT(6) UNSIGNED PRIMARY KEY,
marca VARCHAR(1) NOT NULL,
hrvisto INT(6) NOT NULL,
compvenda INT(6),
dtcotacao DATE,
hrcotacao VARCHAR(10)
);
------
/* SQL para popular a tabela com 1000 registros, utilizando Common Table Expressions (CTE)
(Funciona em MySQL 8 e acima e MariaDB 10 e acima)
*/
INSERT INTO tbAcoes
WITH RECURSIVE my_cte( codigo, marca, hrvisto, compvenda, dtcotacao, hrcotacao) AS
(
SELECT
1 as codigo,
' ' as marca,
98989 as hrvisto,
0 as compvenda,
Current_Date() as dtcotacao,
Left(cast(current_time() as varchar(10)),5) as hrcotacao
UNION ALL
SELECT
codigo + 1 as codigo,
CASE Mod( (codigo + 1), 2)
WHEN 0 THEN ' '
ELSE
CASE
WHEN Mod((codigo + 1), 3) = 0 THEN 'V'
ELSE 'A'
END
END as marca,
99999 - ( mod(codigo + 1, 2) + codigo / 2 ) * 100 as hrvisto,
CASE
WHEN Mod(codigo + 1,
2) <> 0 then 1
ELSE 0
END as compvenda,
CASE
WHEN (codigo + 1) < 50
THEN Curdate()
ELSE
Cast( Date_Sub( Current_Timestamp, INTERVAL (1000000 - ( mod(codigo + 1, 2) + codigo / 2 ) * 1000) SECOND) AS Date)
END AS dtcotacao,
Left(Cast( Date_Sub( Current_Time(), INTERVAL (codigo + 1 ) MINUTE) as VARCHAR(10)),5) AS hrcotacao
FROM my_cte
WHERE codigo < 1000
)
SELECT *
FROM my_cte;
------
/* SQL para criação de tabela e já popular com 1000 registros,
utilizando Common Table Expressions (CTE)
(Funciona em MySQL 8 e acima e MariaDB 10 e acima)
*/
USE test;
CREATE TABLE tbAcoes
WITH RECURSIVE my_cte( codigo, marca, hrvisto, compvenda, dtcotacao, hrcotacao) AS
(
SELECT
1 as codigo,
' ' as marca,
98989 as hrvisto,
0 as compvenda,
Current_Date() as dtcotacao,
Left(cast(current_time() as varchar(10)),5) as hrcotacao
UNION ALL
SELECT
codigo + 1 as codigo,
CASE Mod( (codigo + 1), 2)
WHEN 0 THEN ' '
ELSE
CASE
WHEN Mod((codigo + 1), 3) = 0 THEN 'V'
ELSE 'A'
END
END as marca,
99999 - ( mod(codigo + 1, 2) + codigo / 2 ) * 100 as hrvisto,
CASE
WHEN Mod(codigo + 1,
2) <> 0 then 1
ELSE 0
END as compvenda,
CASE
WHEN (codigo + 1) < 50
THEN Curdate()
ELSE
Cast( Date_Sub( Current_Timestamp, INTERVAL (1000000 - ( mod(codigo + 1, 2) + codigo / 2 ) * 1000) SECOND) AS Date)
END AS dtcotacao,
Left(Cast( Date_Sub( Current_Time(), INTERVAL (codigo + 1 ) MINUTE) as VARCHAR(10)),5) AS hrcotacao
FROM my_cte
WHERE codigo < 1000
)
SELECT *
FROM my_cte;
------
/* SQL para criação do indice */
CREATE INDEX idx_marca_data_hora_cotacao ON tbAcoes (marca,dtcotacao,hrcotacao);
Após criar a tabela, o Ãndice e 1000 registros de teste, algumas consultas simples:
EXPLAIN
SELECT *
FROM tbacoes
WHERE marca = ' '
AND dtcotacao = '2021-04-22'
AND hrcotacao = '05:34'
id|select_type|table |type|possible_keys|key |key_len|ref |rows|Extra |
--|-----------|-------|----|-------------|-------------|-------|-----------------|----|---------------------|
1|SIMPLE |tbacoes|ref |idx_dtcotacao|idx_dtcotacao|20 |const,const,const|1 |Using index condition|
codigo|marca|hrvisto|compvenda|dtcotacao |hrcotacao|
------|-----|-------|---------|----------|---------|
984| | 50849| 0|2021-04-22|05:34 |
------
EXPLAIN
SELECT *
FROM tbacoes
WHERE marca = ' '
AND dtcotacao = '2021-04-22'
AND hrcotacao <= '05:34'
id|select_type|table |type |possible_keys|key |key_len|ref|rows|Extra |
--|-----------|-------|-----|-------------|-------------|-------|---|----|---------------------|
1|SIMPLE |tbacoes|range|idx_dtcotacao|idx_dtcotacao|20 | |9 |Using index condition|
----------------------
codigo|marca|hrvisto|compvenda|dtcotacao |hrcotacao|
------|-----|-------|---------|----------|---------|
1000| | 50049| 0|2021-04-22|05:18 |
998| | 50149| 0|2021-04-22|05:20 |
996| | 50249| 0|2021-04-22|05:22 |
994| | 50349| 0|2021-04-22|05:24 |
992| | 50449| 0|2021-04-22|05:26 |
990| | 50549| 0|2021-04-22|05:28 |
988| | 50649| 0|2021-04-22|05:30 |
986| | 50749| 0|2021-04-22|05:32 |
984| | 50849| 0|2021-04-22|05:34 |
------
EXPLAIN
SELECT *
FROM tbacoes
WHERE marca = ' '
AND dtcotacao = '2021-04-22'
AND hrcotacao >= '05:34'
id|select_type|table |type |possible_keys|key |key_len|ref|rows|Extra |
--|-----------|-------|-----|-------------|-------------|-------|---|----|---------------------|
1|SIMPLE |tbacoes|range|idx_dtcotacao|idx_dtcotacao|20 | |3 Using index condition|
codigo|marca|hrvisto|compvenda|dtcotacao |hrcotacao|
------|-----|-------|---------|----------|---------|
984| | 50849| 0|2021-04-22|05:34 |
982| | 50949| 0|2021-04-22|05:36 |
980| | 51049| 0|2021-04-22|05:38 |
Todas as consultas estão usando o Ãndice criado (Using index condition)
Nota: tanto no MySQL quanto no MariaDB, não são aceitas funções na criação de Ãndices, o que é possÃvel, pelo menos no PostgreSQL.