Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何优化我的MySQL选择查询?_Java_Mysql - Fatal编程技术网

Java 如何优化我的MySQL选择查询?

Java 如何优化我的MySQL选择查询?,java,mysql,Java,Mysql,我得到了一个MySQL数据库表,其形式如下: CREATE TABLE IF NOT EXISTS data_packet ( id BIGINT NOT NULL AUTO_INCREMENT, time_received BIGINT NOT NULL, content TEXT NOT NULL, recording_id INT NOT NULL, PRIMARY KEY (id), INDEX fk_data_packet_recording_idx (reco

我得到了一个MySQL数据库表,其形式如下:

CREATE TABLE IF NOT EXISTS data_packet (
  id BIGINT NOT NULL AUTO_INCREMENT,
  time_received BIGINT NOT NULL,
  content TEXT NOT NULL,
  recording_id INT NOT NULL,
  PRIMARY KEY (id),
  INDEX fk_data_packet_recording_idx (recording_id ASC),
  CONSTRAINT fk_data_packet_recording
    FOREIGN KEY (recording_id)
    REFERENCES recording(id)
)
在这个表中,我得到了如下数据:

<Dat url="vehicleSpeed">
   <Abs name="speed" val="97"/>
   <Enm name="unit" val="kmh"/>
   <Enm name="state" val="valid"/>
</Dat>
我认为这个星座是可以优化的。在MySQL workbench中,此查询需要47毫秒,其中表仅包含约35.000行。Java应用程序将稍后执行查询,我注意到,通过JDBC执行查询需要更多的时间

你能推荐什么样的优化? 指数另一个专栏?另一张桌子


非常感谢。

任何查询优化拇指规则都说,您可能希望索引的顺序与您在where子句中放置列的顺序相同。我建议创建一个包含两列内容、接收的时间的索引,然后在mySQL中使用EXPLAIN命令检查性能

ALTER TABLE data_packet 
  ADD  INDEX `IDX_COMPOSITE` (content,time_received);

EXPLAIN SELECT * 
FROM data_packet 
WHERE recording_id = 1 
    AND content LIKE '%vehicleSpeed%' 
    AND time_received BETWEEN 1435843095338 AND 1435843095996 
ORDER BY time_received ASC;
也可以尝试不排序

EXPLAIN SELECT * 
FROM data_packet 
WHERE recording_id = 1 
    AND content LIKE '%vehicleSpeed%' 
    AND time_received BETWEEN 1435843095338 AND 1435843095996 
谢谢
Anant

您有一个记录id的索引,但没有一个索引也包含接收的时间。根据记录id值的数量及其覆盖的时间范围,这可能会产生重大差异

添加一个包含录制id和接收时间的索引

第二个主要问题是您的查询使用LIKE,与具有前导通配符的值相比。没有索引可以帮助解决这个问题。您可以尝试使用全文索引,然后使用MATCH…对来尝试查找匹配值


不过,我建议最好重新构建数据库。但这在很大程度上取决于存储在内容字段中的数据片段。如果它们都包含url字段,那么我可能只会将其存储在内容字段中,这样您就可以直接检查它,而不需要If,然后将其他字段存储在另一个表中,您可以将该表加入数据包表。

没有及时收到的索引肯定会有帮助,您认为在其中创建一个额外的列,我可以单独存储url,怎么样?索引有什么具体的影响?您可以为列id在表上设置唯一的约束。因为您已经像NOT NULL AUTO INCREMENT那样进行了,所以您可以应用此约束来提高性能。我试图更改表,但出现以下错误:错误代码:1170。没有键长度的键规范中使用的BLOB/TEXT列“content”寻找一个非常好的解释为:接收的时间、内容、接收的时间+内容制作3个索引有意义吗?也许内容会被一个额外的列所取代,只用于存储您正在访问的URL内容和收到的时间,因此建议您不要创建单独的索引,而是按照建议创建一个单独的索引。请您将此答案标记为正确的,并在对您有帮助的情况下应用
EXPLAIN SELECT * 
FROM data_packet 
WHERE recording_id = 1 
    AND content LIKE '%vehicleSpeed%' 
    AND time_received BETWEEN 1435843095338 AND 1435843095996