创建索引需要注意SQL语句的写法

1、避免在where子句中使用 is null 或 not null

2、避免在where子句中使用!=或<>操作符

3、避免在where子句中使用or

4、少用 in 或not in

5、like通配符的使用 不要“%11%” 要“11%”

          例如LIKE“%name”或者LIKE“%name%”,这种查询会导致索引失效而进行全表扫描。但是可以使用LIKE “name%”。

         那么如何解决这个问题呢,答案:使用全文索引。

          在我们查询中经常会用到select id,fnum,fdst from dynamic_201606 where user_name like '%zhangsan%'; 。这样的语句,普通索引是无法满足查询需求的。庆幸的是在MySQL中,有全文索引来帮助我们。

           创建全文索引的SQL语法是:

           ALTER TABLE `dynamic_201606` ADD FULLTEXT INDEX `idx_user_name` (`user_name`);

         使用全文索引的SQL语句是:

        select id,fnum,fdst from dynamic_201606 where match(user_name) against('zhangsan' in boolean mode);

6、避免在where子句中表达式操作 id/2=100 要用id=200

7、避免在where子句中进行函数式操作

8、在子句中使用exists代替in是一个好选择

9、避免在where子句中对字段进行null值判断

       对于null的判断会导致引擎放弃使用索引而进行全表扫描。

10、避免隐式类型转换

    where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换,建议先确定where中的参数类型。

11、分段查询

在一些用户选择页面中,可能一些用户选择的时间范围过大,造成查询缓慢。主要的原因是扫描行数过多。这个时候可以通过程序,分段进行查询,循环遍历,将结果合并处理进行展示。

12、使用合理的分页方式以提高分页的效率

     select id,name from product limit 866613, 20

      使用上述SQL语句做分页的时候,可能有人会发现,随着表数据量的增加,直接使用limit分页查询会越来越慢。

       优化的方法如下:可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。比如此列中,上一页最大的id是866612。SQL可以采用如下的写法:

     select id,name from product where id> 866612 limit 20

13、区分in和exists、not in和not exists

区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题。如何高效的写出一个替代not exists的SQL语句?

原文链接:https://blog.youkuaiyun.com/zs742946530/article/details/82353045

### 创建索引和删除索引SQL语句写法 在数据库中,创建索引和删除索引是常见的操作。以下是它们的SQL语句写法: #### 1. 创建索引 创建索引SQL语句通常使用 `CREATE INDEX` 关键字。例如: ```sql CREATE INDEX index_name ON table_name (column_name); ``` 如果需要创建唯一索引,则可以使用 `UNIQUE` 关键字: ```sql CREATE UNIQUE INDEX index_name ON table_name (column_name); ``` #### 2. 删除索引 删除索引SQL语句通常使用 `DROP INDEX` 关键字。例如: ```sql DROP INDEX index_name; ``` --- ### 完善函数参数设计以实现对数据库表数据的操作 以下是对 `InsertData`、`SelectData`、`UpdateData` 和 `DeleteData` 函数的参数补充,确保能够灵活访问数据库表中的数据。 #### 1. 插入数据函数 `InsertData` 通过传递表名、字段名和对应的值来实现动态插入功能。 ```cpp void InsertData(const QString &tableName, const QStringList &fields, const QVariantList &values) { QSqlQuery query; query.prepare(QString("INSERT INTO %1 (%2) VALUES (%3)") .arg(tableName) .arg(fields.join(", ")) .arg(QString(":").append(fields.join(", :")))); for (int i = 0; i < fields.size(); ++i) { query.bindValue(QString(":%1").arg(fields[i]), values[i]); } if (!query.exec()) { qDebug() << "Failed to insert data:" << query.lastError().text(); } } ``` **说明**: 表名和字段名通过参数传入[^1],确保代码的灵活性和可复用性。 --- #### 2. 查询数据函数 `SelectData` 通过传递表名、查询条件以及需要返回的字段列表,实现动态查询功能。 ```cpp QSqlQuery SelectData(const QString &tableName, const QStringList &fields, const QString &condition = "") { QString selectFields = fields.isEmpty() ? "*" : fields.join(", "); QString queryString = QString("SELECT %1 FROM %2").arg(selectFields).arg(tableName); if (!condition.isEmpty()) { queryString += QString(" WHERE %1").arg(condition); } QSqlQuery query; if (!query.prepare(queryString)) { qDebug() << "Failed to prepare query:" << query.lastError().text(); } if (!query.exec()) { qDebug() << "Failed to execute query:" << query.lastError().text(); } return query; } ``` **说明**: 如果未指定字段,则默认查询所有字段[^1]。条件部分可以通过字符串拼接实现动态过滤。 --- #### 3. 更新数据函数 `UpdateData` 通过传递表名、更新字段及其值、以及更新条件,实现动态更新功能。 ```cpp void UpdateData(const QString &tableName, const QMap<QString, QVariant> &updateFields, const QString &condition) { QStringList setClauses; for (auto it = updateFields.begin(); it != updateFields.end(); ++it) { setClauses << QString("%1 = :%1").arg(it.key()); } QString queryString = QString("UPDATE %1 SET %2 WHERE %3") .arg(tableName) .arg(setClauses.join(", ")) .arg(condition); QSqlQuery query; query.prepare(queryString); for (auto it = updateFields.begin(); it != updateFields.end(); ++it) { query.bindValue(QString(":%1").arg(it.key()), it.value()); } if (!query.exec()) { qDebug() << "Failed to update data:" << query.lastError().text(); } } ``` **说明**: 使用 `QMap` 存储需要更新的字段及其值,便于动态生成 SQL 语句[^1]。 --- #### 4. 删除数据函数 `DeleteData` 通过传递表名和删除条件,实现动态删除功能。 ```cpp bool DeleteData(const QString &tableName, const QString &condition) { QString queryString = QString("DELETE FROM %1 WHERE %2").arg(tableName).arg(condition); QSqlQuery query; if (!query.prepare(queryString)) { qDebug() << "Failed to prepare delete query:" << query.lastError().text(); return false; } if (!query.exec()) { qDebug() << "Failed to delete data:" << query.lastError().text(); return false; } return true; } ``` **说明**: 删除操作仅需指定表名和条件即可完成动态删除[^2]。 --- ### 示例调用 以下是一个完整的示例,展示如何调用上述函数: ```cpp // 插入数据 QStringList fields = {"name", "age"}; QVariantList values = {"Alice", 25}; InsertData("persons", fields, values); // 查询数据 QSqlQuery query = SelectData("persons", QStringList() << "name" << "age", "age > 20"); while (query.next()) { qDebug() << "Name:" << query.value("name").toString() << ", Age:" << query.value("age").toInt(); } // 更新数据 QMap<QString, QVariant> updateFields = {{"age", 26}}; UpdateData("persons", updateFields, "name = 'Alice'"); // 删除数据 if (DeleteData("persons", "name = 'Alice'")) { qDebug() << "Data deleted successfully."; } else { qDebug() << "Failed to delete data."; } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值