mysql 数据库,表每天会插入30W条数据,该表数据千万级,查询效率很慢,建立索引是不是利大于弊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 数据库,表每天会插入30W条数据,该表数据千万级,查询效率很慢,建立索引是不是利大于弊?相关的知识,希望对你有一定的参考价值。

呵呵,我认为可以建立索引,但必须要合理分配IO
为什么:
1:索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据(加快查询);
2:通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 在大型表中使用索引特别有效.
3:虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来 存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.

4:解决方案:
4.1利用分表操作。千万级的数据必须要用垂直分表操作,这样每天插入的数据在不同的表中,索引也就在不同的表的索引中,减少插入带来的效率问题
4.2 索引表空间和数据表空间分开存放。不要把索引和表数据建立在一个磁盘中,利用两个磁盘,分别进行IO操作,也就是索引表空间和数据表空间彻底分开。提高系统IO吞吐量。会有一定的效果,但不如第一个的效果好
参考技术A 如果经常查询肯定要建索引的。索引会占空间,硬盘够大的话。扩大就是了。追问

建立索引会影响插入效率吧?建立索引后每天30W的数据插入量效率大概会降低多少?

参考技术B 必须建立索引追问

建立索引会影响插入效率吧?建立索引后每天30W的数据插入量效率大概会降低多少?

如何从 Eclipse 内部将 jsp 页面中的数据插入 mysql 数据库并在该表上运行查询?

【中文标题】如何从 Eclipse 内部将 jsp 页面中的数据插入 mysql 数据库并在该表上运行查询?【英文标题】:How to insert data from a jsp page into mysql database and run queries on that table , from inside Eclipse? 【发布时间】:2012-07-17 22:39:12 【问题描述】:

我与mysql数据库有以下JDBC连接:

import java.sql.*;

public class Main

    public static void main (String[] args) throws ClassNotFoundException, SQLException
    

        Class.forName("com.mysql.jdbc.Driver");

        String string = "jdbc:mysql://localhost:3306/testdb";

        Connection con = DriverManager.getConnection(string , "root2" , "root");
        PreparedStatement statement = con.prepareStatement("select * from names"); // SELECT * FROM `names`
        ResultSet result = statement.executeQuery();
        while (result.next())
        
            System.out.println(result.getString(1) + " " + result.getString(2));
        


    

当我进入http://localhost/phpmyadmin 并创建一个数据库时,我可以在我在那里创建的数据库上成功运行查询,但是我如何从Eclipse(例如java)内部做到这一点?

为了更清楚,用户在jsp页面中输入数据,我提取数据 从那里 。之后,我想从 Eclipse 内部创建一个数据库,而不是直接进入 http://localhost/phpmyadmin。我怎样才能做到这一点 ?

编辑:

我有所需的 servlet,我现在想要的是从 servlet 创建数据库并从 servlet 运行查询。

谢谢

【问题讨论】:

在所有可能的情况下,最好避免在 JSP (Scriptlets) 中使用 java 代码。您可能需要考虑添加 servlet,然后将上面类中的代码复制到那里。 你想动态创建数据库吗? @thinksteep:我有一个 servlet,我的问题是如何从 servlet 创建数据库并使用 jdbc 运行它。 你试过了吗:executeQuery("create database mydatabase"); ?但是你为什么要这样做呢? 【参考方案1】:

您的问题的完整答案需要大量的写作和很少的澄清。

有很好的教程可以使用: Creating Database Web Applications with Eclipse

您将使用 MySQL 而不是 Derby DB。

【讨论】:

以上是关于mysql 数据库,表每天会插入30W条数据,该表数据千万级,查询效率很慢,建立索引是不是利大于弊?的主要内容,如果未能解决你的问题,请参考以下文章

自动从 Mysql 表中删除的记录

mysql数据脏读幻读不可重复读

MySQL 仅在表不存在时插入数据

INSERT INTO MySQL 表 SELECT FROM PostgreSQL 表

MySQL数据库 *实验19触发器

Mysql注入 -- 堆叠注入