主键、索引、sql语句优化、数据类型选择

主键、索引、sql语句优化、数据类型选择

1、主键、外键、唯一键

主键Primary key:数据库实体完整性的一种规则,唯一标示一个实体,取值非空唯一。比如,学生表的学号。
外键 Foreign key:数据库参照完整性的一种规则,将两表或者多张表联系起来,取值必须来自参照表的参照字段的值,可为空也可不为空。比如,选课表里的学号。
唯一键:Unique约束可以唯一地标识关系或表中的单个元组。与主键不同,一个表可以有多个唯一键。唯一键约束只能接受列的一个空值;唯一约束也由另一个表的外键引用。当有人想对非主键的列和列组实施唯一约束时,可以使用它。

#查询表结构,可以看到主键、外键、唯一键(如果有的话)
desc table;

表结构里面键为MUL,则该列的值可以重复, 该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL

2、索引

使用索引可快速访问数据库表中的特定信息例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找,但索引需要占物理空间,也降低了数据的维护速度,所以不是越多越好。
索引分类:普通索引、唯一索引、主键索引、多列索引

#显示已有的索引
show INDEX FROM table1;

主键索引:它是一种特殊的唯一索引,不允许有空值。
唯一索引:索引列的值必须唯一,但允许有空值

#创建唯一索引
CREATE UNIQUE INDEX frame_num_index on payment_invoices_management(frame_num);
#创建多列索引
CREATE INDEX payment_framenum_invoicevalidity on payment_invoices_management(frame_num,invoice_validity);
#删除索引
ALTER TABLE payment_invoices_management DROP INDEX payment_framenum_invoicevalidity;

覆盖查询与非覆盖查询(frame_num是主键)
覆盖查询:

SELECT frame_num FROM payment_invoices_management WHERE frame_num='LRH03120000000001';

非覆盖查询:

SELECT frame_num FROM payment_invoices_management WHERE invoice_number=666;

3、Sql语句优化

a、尽量少写SELECT *的语句,只返回需要的数据,合理写WHERE子句,不要写没有WHERE的SQL语句。尽量少做重复的工作可以合并一些sql语句
b、尽量避免进行全表扫描如下:
左模糊查询’%…’
使用了不等操作符!=
Or使用不当,or两边都必须有索引才行
In 、not in
Where子句对字段进行表达式操作
对于创建的复合索引(从最左边开始组合),查询条件用到的列必须从左边开始不能间隔。否则无效,复合索引的结构与电话簿类似
全文索引:当于对文件建立了一个以词库为目录的索引(文件大全文索引比模糊匹配效果好)能在char、varchar、text类型的列上面创建全文索引,MySQL 5.6 Innodb引擎也能进行全文索引,搜索语法:MATCH (列名1, 列名2,…) AGAINST (搜索字符串 [搜索修饰符]),如果列类型是字符串,但在查询时把一个数值型常量赋值给了一个字符型的列名name,那么虽然在name列上有索引,但是也没有用到。
c、 使用join代替子查询
d、 使用union代替手动创建临时表

4、数据类型选择

数字类型
Float和double选择(尽量选择float)
区分开TINYINT / INT / BIGINT,能确定不会使用负数的字段,建议添加 unsigned定义
能够用数字类型的字段尽量选择数字类型而不用字符串类型的
字符类型
char,varchar,TEXT的选择:非万不得已不要使用 TEXT 数据类型,定长字段,建议使用 CHAR 类型(填空格),不定长字段尽量使用 VARCHAR(自动适应长度,超过阶段),且仅仅设定适当的最大长度
时间类型
按选择优先级排序DATE(精确到天)、TIMESTAMP、DATETIME(精确到时间)
ENUM
对于状态字段,可以尝试使用 ENUM 来存放
避免使用NULL字段,很难查询优化且占用额外索引空间

猜你喜欢

转载自blog.csdn.net/Krystal_RonghuiLi/article/details/107999397