关于mysql的一些总结记录,备查

公众号:yunops

MySQL 笔记

CREATE DATABASE :创建数据库;
create database if not exists Northwind;
# 如果Northwind库不存在,创建之;

create database if not exists Northwind default charset utf8 collate utf8_general_ci;
# 如果Northwind库不存在,创建字符集为utf8,排序规则为utf8_general_ci的数据库;
CREATE TABLE:创建表
create table TableTest (Name varchar(255), Age int, Address varchar(255));
# 创建TableTest表,包含三列,且数据类型分别为字符型、整形、字符型;

create table TestConstraint (id int PRIMARY KEY, name varchar(255) NOT NULL, age int);
# 创建TestConstraint表,且指定主键、name列非空;

create table Persion (id int PARMARY KEY, age int NOT NULL, name varchar(255) NOT NULL, constraint ConsName(age, name));
# 创建Persion表指定多个约束并为多个约束命名;

alter table Persons alter City set DEFAULT 'ShangHai';
# mysql中修改City列默认值约束为ShangHai;

约束(Constraints):用于指定表中的数据规则,可创建表时创建,或使用 ALTER 修改 NOT
SELECT DISTINCT:返回唯一不同值;
select distinct City from Customers;
# 查询Customers表中City列中的唯一的取值;
SELECT * FROM test GROUP BY num HAVING COUNT(num) =1 ORDER BY num ASC LIMIT 0,1;
# group by:num分组;count(num=1):num值唯一;ASC:num值升序排列;LIMIT0,1:取升序排列的第一个值(从第0个数据开始取值,取一个值);
SELECT WHERE:条件查找
select * from Customers where City='Paris';
# 查找Customers表中City字段为Paris的行,双引号也被大部分数据库支持,数值字段不加引号;
# 判断条件还有<>、<、>、>=、<=、between 'Jan-06-2015' and 'Jan-06-2015'、like '%abc%'、in (a,b,c)等,互斥查找添加not;

select * from Customers where City='Paris' and Country='France';
# 查找Country值为France并且City值为Paris的条目;

select * from Customers where City='Paris' or Country='Canada';
# 查找Customers表中City值为Paris或者Country值为Canada的条目;

select Address from Customers where Country='Fance' and (City='Paris' or city='Lyon');
# 查找Customers表中Country值为Fance并且City值为Paris或者Lyon的条目中的Address信息;

SELECT * FROM wtp RIGHT JOIN user ON user.mac=wtp.mac WHERE wtp.mac IS NULL AND id=0
# 查找在mac字段值在user中而不在wtp表中(并且过滤id=0)的条目
SELECT WHRER FOR UPDATE:对 select 的特定数据表进行加锁操作

(注:使用必须关闭 mysql 数据库的自动提交属性:set autocommit=0;)

select status from goods where id=1 for update;
# 查询商品状态且防止操作结束前状态被改动
SELECT ORDER BY:对查找结果排序(DESC 降序,ASC 升序)
select CustomerID from Customers where City='Paris' order by CustomerID DESC;
# 查找Customers表中City值为Paris的条目中的CustomerID,并把查询结果按照CustomerID的值做降序排列;

select * from Customers order by City,Country;
# 查找Customers表中的所有信息并把查询结果按照City和Country排序;
INSERT INTO:数据表中插入数据
insert into Customers (CustomerName,City,Country) values ('Wartian','Paris','France');
# 向Customers表中插入一条指定列CustomerName、City、Country值为Wartian、Paris、France的新行;

INSERT INTO Customers (CustomerID,CompanyName,ContactName,ContactTitle,Address,City,Region,PostalCode,Country,Phone,Fax) VALUES ('China','Shine China', 'Shine', 'Master', '滨江', '杭州', NULL, '411282', 'China', '191835412', '635478465');`
# 向Customers表中插入一条包含所有属性列值新数据;

ON DUPLICATE KEY UPDATE

UPDATE SET WHERE:条件更新表数据
update Customers set Address='ZhuoZhengyuan' where City='SuZhou' and Country='China';
# 将Customers表中City属性值为SuZhou并且Country属性值为China的条目的Address属性值设置为ZhuoZhengyuan;

!注!: UPDATE 语句中的 WHERE 子句通常必选!省略了 WHERE 子句会导致所有的记录都将被更新! !注!:mysql 查询结果不允许直接 update,可通过加一层 select 至临时表达到该效果

UPDATE wtp set id=1 WHERE mac IN (SELECT mac FROM(SELECT wtp.mac FROM wtp RIGHT JOIN newTable ON newTable.mac = wtp.mac AS TEMPTABLE))
# 将wtp表中mac与newTable表中mac相同的条目id值改为1

select count(1) from (select id from opt_unit WHERE id=11) as tmp_count
# 在查询结果中查询(子表查询,必须加别名)
DELETE WHERE:条件删除数据
delete from Customers where City='SuZhou';
# 删除Customers 表中City之为SuZhou的条目;

!注!: UPDATE 语句中的 WHERE 子句通常必选!省略了 WHERE 子句会导致所有的记录都将被删除!

delete * from Guests truncate Guests
# 删除表中所有行,保留表结构、属性、索引等,也可以用truncate实现;
SELECT LIMIT:mysql 规定返回记录数目(SQL Server 为 TOP)
select * from Customers limit 5;
# 返回Customers前5条数据;

select * from Customers limit 5,10;
# 返回Customers表中的第6到16条数据(从第一条数据开始取值,取十条);
LIKE 通配符:%、_
select * from Customers where City like 'Lon%';
# 返回Customers表中City值为Lon开头的所有条目;

select * from Customers where City like 'Chin_';
# 返回Customers 表中City值为Chin开头,第五位为任意字符的条目;
正则通配符[”^%char”|”%char%”,”_”,”?someletter$”]

WHERE 谓词有三个,分别是:REGEXP, RLIKE, NOT RLIKE

select * from Customers where City RLIKE '^C';
# 返回Customers表中City值为C开头的条目;
SELECT AS :别名 Alias
select c.Country , o.OrderID from Customers as c , Orders as o where c.Country='China';
# 将Customers表指定别名c,Order表指定别名o,以Country值为China为过滤条件返回Customers表中的Country和Orders表中的OrderID;
(INNER)JOIN ON:基于共同字段连接表
select Orders.OrderID , Customers.Country from Orders inner join Customers on Customers.CustomerID=Orders.CustomerID;
# 返回Customers表和Orders表中CustomerID值相同条目的Orders.OrderID列和Customers.Country列
LEFT JOIN ON:返回左表全部及右表匹配值
select Orders.* , Customers.* from Orders left join Customers on Customers.CustomerID=Orders.CustomerID;
# 返回Orders表的所有数据并外连Customers表中CustomerID值相同的条目;
RIGHT JOIN ON:返回右表全部及左表匹配值
select Orders.* , Customers.* from Orders right join Customers on Customers.CustomerID=Orders.CustomerID;
# 返回Customers表的所有数据并外连Orders表中CustomerID值相同的条目;
FULL OUTER JOIN ON:左右表中只要有一个存在匹配就返回匹配值(mysql 不支持,使用 UNION 变通实现)
select Customers.CustomerID , Orders.OrderID from Customers full outer join Orders on Customers.CustomerID=Orders.CustomerID;
# 返回CustomerID相等的Customers.CustomerID及Orders.OrderID值

select c.CustomerID , o.OrderID from Customers as c , full outer join on Orders as o on c.CustomerID=o.CustomerID;
UNION / UNION ALL:合并多个 SELECT 查询结果

说明:

  1. 要求每个 SELECT 语句必须拥有相同数量的列、列必须拥有相似的数据类型、每个 SELECT 语句中的列的顺序必须相同
  2. UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL

select City from Customers union select City from Suppliers order by City;
# 返回Customers表和Suppliers表中不同的City值,并把查询结果按照City排序;

select City from Customers union all select City from Suppliers;
# 返回Customers表和Suppliers表中所有的City值,重复的City值算作不同的记录;

select City, Country from Customers where Country='Germany' union all select City, Country from Suppliers where Country='Germany' order by City;
# 返回Customers表和Suppliers表中Country值为Germany的所有City和Country值;
临时表:可用于临时存储数据
select sys_user.username,tmp.account_id,tmp.num from (SELECT account_id,COUNT(*) as num FROM user GROUP BY account_id ORDER BY COUNT(*) DESC) as tmp join sys_user on(tmp.account_id=sys_user.id)
# 使用临时表tmp,将user表查询结果(分组、降序)与sys_user联合查询
SELECT INTO:复制查询结果到本库或者其他库中新表【mysql 不支持,通过 createtable A (select * from B)实现】
select * into Customersback from Customers;
# 选取Customers所有数据插入新表Customersback;

select * into Customersback from Customers in DB2;
# 选取Customers所有数据插入数据库DB2的新表Customersback中;

select Customers.CustomerID, Orders.OrderID into Customersback from Customers left join Orders on Customers.CustomerID=Orders.CustomerID as Customer,Order;
# 选取Customers表与Orders表中CustomerID相等的数据中的CustomerID列和OrderID列指定别名为Customer和Order插入新表Customersback中;
INSERT INTO SELECT:复制表复制信息到另一个已存在的表
insert into Customers (CustomerName, Country) select SupplierName, Country from Suppliers where Country='Germany';
# 选取Suppliers表中Country值为Germany的条目的SupplierName和Country列插入Customers表中的CustomerName列和Country列;
CREATE (UNIQUE)INDEX:创建(唯一)索引

CREATE INDEX <索引名> ON 表名(列 1,列 2,...);

索引说明:
  1. 应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引,普通索引允许被索引的数据列包含重复的值;
  2. 如果能确定某个数据列将只包含彼此各不相同的值,创建索引时可用 UNIQUE 定义为唯一索引,可提高效率、简化索引管理;
  3. 符合索引:索引可以覆盖多个数据列,如 INDEX(A,B,C)索引,特点是可以被选择性使用(仅适用于在复合索引中排列在前的数 据列组合),如该索引可以当做 A 或(A,B)的索引来使用,但不能当做 B、C 或(B,C)的索引来使用。
  4. 索引的长度:为 CHAR 和 VARCHAR 类型的数据列定义索引时,可以把索引的长度限制为一个给定的字符个数(这个数字必须小于这个 字段所允许的最大字符个数),好处是可以生成一个尺寸比较小、检索速度却比较快的索引文件。
  5. 主键索引默认被创建;
  6. 若列创建有索引,不要在列上进行运算,会导致索引失效;
  7. like 语句中“%aaa%” 、“%aaa”不会使用索引,而“aaa%”可以使用索引;
  8. 若列创建有索引,使用 NOT IN 和<>操作会导致索引失效;
  9. 多列索引优于单列索引
  10. 索引最好在 myisam 表上使用 b、一个复合索引最多包含 16 个列
  11. 确定一个列是否适合做索引,看 select count(distinct colname)/count(*) from table,如果该值接近 0.31 就适合做索引(当然越大越好),如果接近 0 则不适合做索引,也就是说该列没有太多的唯一值,而是有太多的重复值,这样将不适合做索引;
  12. 前缀索引不能用于 order by 和 group by
  13. 对于一个 sql 语句最适合做索引的是 where 部分和 order by 部分
  14. 全文索引:适合的字段类型为 char、varchar、text ;

create unique index PCountry on Customers (Country(15)) ;
# 为Customers表的Country列创建名为PCountry、长度为15的唯一索引;

alter table Customers add index PCountry (Country);
# 为Customers表的Country列创建名为PCountry的索引;

alter table Customers drop index PCountry;
#删除Customers表中名为PCountry的索引;

create index PCountry on Customers (Country, Phone);
# 为Customers表的Country、Phone列创建名为PCountry的索引;

show index from Customers;
# 显示Customers表中的索引信息;
DROP INDEX/TABLE/DATABASE:删除索引/表/数据库
alter table Customers drop index PCountry;
# 删除Customers表中名为PCountry的索引;

drop table Persons;
# 删除Persons表;

truncate table Persons;
# 清空Persons表数据,保留表结构;

drop database TestDrop;
# 删除TestDrop数据库;
ALTER TABLE:修改表结构
alter table Persons add column Address varchar(255) after id;
# 在Persons表中id列后添加列Address,并指定为字符型;

alter table Persons drop column Address;
# 删除Persons表中的Address列;

alter table Persons modify column Address varchar(200);
# 修改Persons表中Address的字符类型;

alter table Persons change column Address Add varchar(255);
# 修改Persons表的Address列名称为Add并指定为字符型;

alter table Persons modify column Number int not null;
# 指定表Persons中的Number列为非空;

alter table Persons modify column Number auto_increment;
# 设置Persons表中的Number列自增(主键);
VIEW:视图
视图说明:
  1. 视图是由查询结果形成的虚拟表,引用方式同表;
  2. 如果某个查询结果频繁出现,经常要被拿来做子查询,就可以将这个查询结果写成一个视图用来简化查询;
  3. 用途:简化查询语句、
    • 进行权限控制(将表中指定列显示在视图中):create view showpart as select goods_id,goods_name from goods;
    • 大数据分表后联合各子表:create view showall as select * from table1 union select * from table2 union ...;
  4. 视图的数据与表的数据一一对应时可以修改,并且该修改会影响到表;
  5. 视图使用 insert 时必须包含表中没有默认值的列;
  6. 视图的运算规则(algorithm):
    • algorithm=merge:引用视图时合并创建视图和查询视图的语句,查询对象为原表;
    • algorithm=temptable:创建视图时形成虚拟表,引用时查询该虚拟表;
    • algorithm=undefined:未定义,由系统自动选择;

create view Personal as select id,name from Persons;
select * from Personal;
# 为Persons表的id和name列的查询结果创建一个名为Personal的视图;
# 返回试图内全部数据;

alter view Personal as select Number from Personal;
# 修改Personal视图;

drop view Personal
# 删除Personal视图
Date 函数(mysql 中):

select * from Orders where OrderDate='2015-11-11';
# 返回Orders表中OrderDate值为2015-11-11的条目

FROM_UNIXTIME(date)
# 将date列由时间戳模式转化为标准时间格式;

SELECT mac FROM station WHERE auth_time BETWEEN '1489420800' AND '1489507200';
#返回station表中auth_time在指定时间区间内的条目(2017-3-14 00:00:00 === 2017-3-15 00:00:00)
NULL 值处理:

说明:NULL 值不能用运算符如=、<、>等进行比较,必须使用 is NULL 或者 is NOT NULL;

select * from Persons where Number is NULL;
# 返回Persons表中Number值为NULL的条目;
IFNULL 函数:IFNULL(A, B):若 A 非空,返回 A,否则返回 B;
IF 函数:IF(expr, A, B):若 expr 为 true,返回 A,否则返回 B;
select ProductName, UnitPrice*(UnitsInstock + ifnull(UnitOnOrder,0)) from Products;
# 返回Products表中的ProductName和总价(单价x(基数+额外));
数据类型:Text 类型、Number 类型、Date 类型:

类型细分不做详述,常用通用类型有:varchar()、bollean、int、float、date、string、time、array、xml;

SQL 函数

select AVG(UnitPrice) as PriceAverage from Products;
# 返回Products表中UnitPrice列的平均值并指定别名为PriceAverage;

select ProductsName, UnitPrice from Products where UnitPrice > (select AVG(UnitPrice)from Products);
# 返回Products表中UnitPrice大于平均值的ProductsName和UnitPrice;

select COUNT(distinct CustomerID) from Orders;
# 统计Orders表中值唯一的CustomerID数目;
GROUP BY:用于结合 Aggregate 函数,根据一个或多个列对结果集进行分组;

说明:没有使用聚合函数的列,必须出现在 group by 后面;

select Shippers.ShipperID, COUNT(Orders.OrderID) from Shippers inner join Orders on ShipperS.ShipperID=Orders.ShipperID group by ShipperID;
HAVING:筛选聚合后的各种数据(where 字句筛选聚合前的数据):

说明:WHERE 子句作用于表和视图,HAVING 子句作用于聚集之后的分组;

select Province, SUM(Population), SUM(City) from People GROUP BY Province having SUM(Population) > 100000;
# 统计省份人口总和(所有城市),并返回人口总数大于100000的条目;

select Employees.LastName, COUNT(Orders.OrderID) as NumberOfOrders from (Employees inner join Orders on Employees.EmployeeID=Orders.EmployeeID) group by LastName having COUNT(Orders.OrderID) > 10;
# 返回注册超过10 个订单的员工姓名及订单总数;
UCESE():把字段值转换为大写、LCASE():把字段值转换为小写:
select UCASE(CompanyName) as Company, City from Customers;
#返回Customers表的公司及城市,并把公司名转换为大写;
MID(column,start,length):从文本字段中提取字符

说明:column_name:列名,必填;start:起始位置,必填(默认为 1),负值表示从末位起始匹配;length:返回字符数,选填(不填返回剩余所有字符);

SELECT MID(column_name, start, length) FROM table_name;
# 示例格式

select distinct MID(City,1,4) as ShortCity from Customers;
# 返回Customers表中City列的前四个字符(唯一的);
REPLACE(column_name,from_str,to_str):替换文本字段中的字符

说明:column_name:列名,from_str:原始字符,to_str:替换后的字符;

SELECT REPLACE(mac,':','-') as new_mac FROM station;
# 转换station表中的mac格式并返回(将: 分隔符替换为- )
LENGTH():返回字符长度
select City from Costomers order by LENGTH(City) limit 5;
# 返回Customers表中City值最长的5条记录;
ROUND(column,num):把数值字段舍入指定小数位说明:column:列名,必填;num:小数位数,必填;
select ROUND(UnitPrice,1) as Price from Products;
# 返回Products表中的UnitPrice列的值,保留一位小数,指定别名为Price;
CONCAT(column1,column2):合并两列字符串形成单一字符串
select CONCAT(one, two) as three FROM table_name;
# 返回one,two列合并后的字符为three列

select CONCAT('"', CONCAT(wtp_id, '"')) as wtp from station;
# 将station表中的wtp_id查询出来加上双引号并记录别名为wtp
NOW():返回当前系统日期时间(相当于添加一列时间)
select ProductName, UnitPrice as PerPrice, now() from Products;
# 返回Products表中当前时间及当前时间的ProductName及UnitPrice(指定别名为PerPrice);
FORMAT(column,formit):对字段格式进行格式化

说明:column:列名,必填;formit:规定格式,必填;

select ProductName,UnitPrice, FROMAT(now(),'YYYY-MM-DD') as PerDatefrom Products;
# 返回ProductName以及当天(格式化为YYYY-MM-DD)的UnitPrice;
(函数)存储过程(procedure):

说明:存储过程是一组为了完成特定功能的 SQL 语句集(是一个可编程的函数),经编译后存储在数据库中,用户通过指定存储过程的名字并 给定参数(如果该存储过程带有参数)来调用执行它;优点很多,主要体现在:提高执行效率、封装 SQL 代码;

a)参考:http://blog.csdn.net/woshixuye/article/details/8348180

创建语法:

create procedure if not exists 存储过程名( in/out/inout 参数参数类型)
begin
    MySQL语句;
end;

b)说明:

  1. 参数:习惯上,MySQL 存储过程参数如果不显式指定为 in、out、inout,默认为 in;
    • in:值必须在调用时指定,值不能返回(值传递);
    • out:值可以返回(指针传递);
    • inout:值必须在调用时指定,值可以返回;
  2. Mysql 存储过程名后“()”是必须的,即使没有参数;
  3. MySQL 存储过程参数(变量)前不能加“@”(SQL Server 允许),MySQL 客户端用户变量前需要加“@”;
  4. MySQL 存储过程的参数不能指定默认值;
  5. 不能在 MySQL 存储过程中使用“return” 关键字;
  6. 变量:使用 DECLARE 来声明,DEFAULT 赋默认值,SET 赋值;
  7. 条件判断:IF THEN、ELSEIF、ELSE、END IF
  8. 循环:LOOP、END LOOP;WHILE DO、END WHILE;REPEAT、UNTILL
  9. 数据库交互:
    • INTO 用于存储单行记录的查询结果;
    • CURSOR 用于处理多行记录的查询结果;
    • unbounded SELECT 语句用于存储过程返回结果集

c)调用:

call 存储过程名();
call 存储过程名(a, b);
或者
set @a=10;
set @b=20;
call 存储过程名(@a,@b);

d)其他:

事件(event)

a)创建事件:

create event if not exists 事件名

on schedule schedle
# 定义执行的时间和时间间隔,schedle有两种方式:1、单次执行:at 时间戳;2、重复执行:every 数量时间单位;
on completion not preserve
# 事件在执行结束后移除保留,去掉not表示保留;

enable
# 事件定义完成后开启还是关闭
do
sql语句;
#事件内容

b)其他:

触发器(TRIGGER):

说明:触发器是一种与表操作有关的数据库对象,用于监视某种情况,并触发相应操作;

a)触发器创建语法四要素:

  1. 监视地点(table)
  2. 监视事件(insert/update/delete)
  3. 触发时间(after/before)
  4. 触发事件(insert/update/delete)

创建触发器过程中 sql 语句以“;”结束,但是不能中断创建触发器这个动作,需重新指定结束符,例如$:delimiter$,语法:

create trigger 触发器名
    after/before insert/update/delete on 表名
    # 触发条件,那个表、什么事件、之前还是之后;
    for each row
    # 触发器的执行间隔,这句话在MySQL中创建触发器时是固定的;
begin
    sql语句;
    # 触发后执行的操作;
end$

after 和 before 的区别:

在触发器中引用行的值:

b)其他:

Mysql 事务(transaction):

说明:指一组数据库操作,主要用于处理操作量大,复杂度高的数据,用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行;MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

a)事务必须满足 4 个条件(ACID):

  1. Atomicity(原子性):一组事务,要么成功;要么撤回。
  2. Consistency(稳定性) : 有非法数据(外键约束之类),事务撤回。
  3. Isolation(隔离性):事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的 100%隔离,需要牺牲速度。
  4. Durability(可靠性):软、硬件崩溃后,InnoDB 数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit选项决定什么时候吧事务保存到日志里。

    说明:如果出了错误,事务也不允许撤销,只能通过“补偿性事务”补救;

b)语法:

start transaction;
sql语句
sql语句
commit;
#提交,或者回滚:roolback;

其他补充

一、函数和过程的区别:
  1. 标识符不同。函数的标识符为 FUNCTION,过程为:PROCEDURE。
  2. 函数有返回值,且必须返回,调用时,除在 select 中,必须将返回值赋给变量;过程没有返回值,不能将结果直接赋值给变量;
  3. 函数可以在 select 语句中直接使用,而过程不能。例如:假设已有函数 fun_getAVG()返回 number 类型绝对值。那么 select fun_getAVG(col_a) from table 这样是可以的。
二、表的存储引擎

  1. MyISAM:适合读多写少的应用,且对数据一致性恢复性要求不高、对事务的完整性,并发性要求不高的应用;是在 web、数据仓 储和其他应用环境下最常用的的存储引擎;
  2. InnoDB:支持事务,提供了具有提交,回滚和崩溃恢复能力的事务安全。对比 MyISAM 的存储引擎,InnoDB 写的处理效率差一 些,并且会占用更多的磁盘空间以保留数据和索引。
  3. 查看、修改表的存储引擎:
    1. 查看:show table status from db_name where name='TableName';
    2. 查看系统支持的存储引擎:show engines;
    3. 修改方式一(直接修改,缺点:慢):alter table TableName ENGINE=InnoDB;
    4. 修改方式二(导入导出,缺点:不安全):导出,修改 sql,导入;
    5. 修改方式三(创建新表、插入):
      • create table NewTable like OldTable;
      • alter table NewTable ENGINE=InnoDB;
      • insert into NewTable select * from OldTable;
三、查询优化:
  1. from 后边的表数据少的放在右边(多个表查询的时候)
  2. where 后边过滤行数多的放在右边
  3. select 少用够用就行(尽量不用,即使查询全部字段也要尽量全部写出来,这样的效率会高)
  4. 能用连接查询绝不用子查询,因为子查询的的底层就是连接查询
  5. 合理使用索引提升效率(索引的本质是提高效率的机制,本质上是一棵树)
    • 为经常出现在 where 子句中的列创建索引
    • 为经常出现在 order by,distinct 中的字段建立索引
    • 不要经常在 DML 的表上建立索引(容易造成索引不准,解决方法为 rebuild 重新建立,任何 DML 操作都是更新 index,这是代价)
    • 不要在小表上简历索引(索引简历和维护也是要消耗资源的,小表上建立索引会造成索引的维护时间大于数据查询时间)
    • 限制表上的索引数目,索引并不是越多越好(索引会占用表空间,还要额外的维护)
    • 删除很少被使用的,不合理的索引
四、其他:
  1. mysql 命令行查询结果不显示列名(列标题):-N 参数;
  2. mysql 命令(truncate),清理表数据,并归 1 自增 ID 的值,但 myisam 的表和 innodb 的表在使用上有一定的区别。myisam 表会清空所有数据,并释放表空间,即硬盘空间会得到释放。innodb 表也会清空所有数据,但不释放表空间 参考如下:http://www.cnblogs.com/xuxyblog/p/3966430.html