?????????结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
尽量使用索引
尽量减少返回的数据量
尽量避免使用复杂的表达式、函数和子查询
尽量避免使用or、in、not in、<>、!=等操作符
尽量避免进行null值的判断
索引可以帮助数据库快速定位到需要的数据,避免全表扫描。索引的建立应该考虑到查询条件中经常出现的字段,以及数据的分布情况。索引也不是越多越好,因为索引会占用额外的空间和更新成本。
例如,如果我们要查询学生表中姓名为张三的学生的信息,我们可以在姓名字段上建立索引,这样数据库就可以直接找到对应的记录,而不需要扫描整个表。
-- 建立索引
create index idx_name on student(name);
-- 查询
select * from student where name = '张三';
只返回需要的字段和记录,避免使用select *。如果数据量很大,可以使用分页或者limit来限制返回的行数。这样可以减少磁盘IO和网络IO,提高查询速度。
例如,如果我们只需要查询学生表中学生的姓名和性别,我们可以只选择这两个字段,而不需要选择其他无关的字段。如果我们只需要查询前10条记录,我们可以使用limit来限制返回的行数。
-- 只选择需要的字段
select name, gender from student;
-- 限制返回的行数
select name, gender from student limit 10;
这些操作会增加数据库的计算负担,可能导致无法使用索引。尽量将复杂的逻辑放在应用层处理,或者使用存储过程、视图等方式优化。
例如,如果我们要查询学生表中今年成年的学生的信息,我们可以在应用层计算出今年成年的年龄范围,然后直接在查询条件中使用这个范围,而不需要在查询中使用函数或者子查询。
-- 在应用层计算出今年成年的年龄范围
-- 假设今年是2023年
min_age = 2023 - 18;
max_age = 2023 - 0;
-- 在查询条件中使用年龄范围
select * from student where age between min_age and max_age;
这些操作符会导致数据库放弃索引进行全表扫描。可以使用union、exists、between等替代方案来优化。
例如,如果我们要查询学生表中姓名为张三或者李四的学生的信息,我们可以使用union来合并两个单独的查询,而不需要在一个查询中使用or。
-- 使用union来合并两个单独的查询
select * from student where name = '张三'
union
select * from student where name = '李四';
null值会导致数据库放弃索引进行全表扫描。可以给字段设置默认值,或者使用其他方式避免null值的出现。
例如,如果我们要查询学生表中没有选课的学生的信息,我们可以给选课字段设置一个默认值,比如0,然后在查询条件中使用这个默认值,而不需要使用is null或者is not null。
-- 给选课字段设置一个默认值
alter table student modify column course int default 0;
-- 在查询条件中使用默认值
select * from student where course = 0;