积木首页 - 学院 - 软件测试 - 技术百科 - 问答 - 黄页 - 手册 - 站长工具 - 社区
登录 | 注册
积木技术社区 » MySQL » MySql 数据库查询优化
打印 楼主:dengzy 发表于 2011-01-12 11:43 [回复39次/有效36个,浏览829次]

MySql 数据库查询优化 [精]

SQL code
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_orderstatus` AS
select
`order_list`.`ID` AS `ID`,
`order_list`.`OrderID` AS `OrderID`,
`order_list`.`UserID` AS `UserID`,
`order_product_list`.`ProductID` AS `ProductID`,
`product_list`.`ProductName` AS `ProductName`,
`order_list`.`TotalPrice` AS `TotalPrice`,
`order_list`.`CreateDate` AS `CreateDate`,
`order_status`.`StatusName` AS `Order_StatusName`,
`order_list`.`ShippingPrice` AS `ShippingPrice`,
`payment_type`.`PaymentType` AS `PaymentType`,
`order_delivery_status`.`StatusName` AS `Delivery_StatusName`,
`order_list`.`HasHardware` AS `HasHardware`,
`order_list`.`OrderType` AS `OrderType`,
`order_list`.`TransactionID` AS `TransactionID`,
`order_list`.`ContactEmail` AS `ContactEmail`,
`order_list`.`SendMailStatus` AS `SendMailStatus`,
`order_list`.`OrderStatus` AS `OrderStatus`,
`order_list`.`DeliveryStatus` AS `DeliveryStatus`,
`currency_list`.`CurrencyID` AS `CurrencyID`,
`currency_list`.`ISOCurrencyCode` AS `PaymentCurrency`
from
((((((`order_delivery_status` join `order_list` on((`order_delivery_status`.`DeliveryStatus` = `order_list`.`DeliveryStatus`))) join `currency_list` on((`currency_list`.`CurrencyID` = `order_list`.`PaymentCurrencyID`))) join `order_status` on((`order_list`.`OrderStatus` = `order_status`.`OrderStatus`))) join `payment_type` on((`order_list`.`PaymentTypeID` = `payment_type`.`ID`))) left join `order_product_list` on((`order_list`.`ID` = `order_product_list`.`OrderID`))) left join `product_list` on((`order_product_list`.`ProductID` = `product_list`.`ProductID`)))
group by
`order_list`.`ID`;
关联的表比较多.order_list和order_product_list表是一对多关系.数据库数据量比较多.100W条记录.
如果上面这视图不加group by 的话,查询的时候至少是300W条记录以上,这导致数据库查询将超过50秒.
求大虾给个想法.!
2楼 发表于 2011-01-12 11:57
优化数据库有需要多方面下手,除了索引之外还有许多可以考虑的因素。
3楼 发表于 2011-01-12 12:10
恩恩.这个问题我已经解决了.就是数据查询优化的还得多看看.数据库300W条数据,如果建立索引查询的话,应该不会很慢吧.!
4楼 发表于 2011-01-12 12:23
你的存储过程的完整代码是什么?
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.gimoo.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
5楼 发表于 2011-01-12 12:37
用临时表的话,能查询出数据.!:也就是说
select @MaxID:=MAX(ID) from `order_list`;
是取到MAX(ID)的值的
6楼 发表于 2011-01-12 12:42
把所有表的show index from tbname贴出来看看。
7楼 发表于 2011-01-12 12:52
用临时表的话,能查询出数据.!
8楼 发表于 2011-01-12 13:06
我这数据库,关联的表太多了.比较复杂.如果这样写的话我估计大家都会看上半小时去了.我还是抓重点吧.
我用的是MySql5
9楼 发表于 2011-01-12 13:18
那就插入到临时表中,检查结果,建立LSB,1个字段
select @MaxID:=MAX(ID) from `order_list`;
insert into lsb values(@MaxID);
10楼 发表于 2011-01-12 13:44
大部分情况下是这样,MYSQL会自动利用索引进行SQL语句的优化,但一些情况下还是需要人为的干预。
11楼 发表于 2011-01-12 13:49
还有个问题,索引是不是只要建立了就可以了.不用再写其他什么代码吧.!
13楼 发表于 2011-01-12 14:08
我是新手,能不能说得明白点.用小结果集驱动大结果集的原则???什么意思.!
14楼 发表于 2011-01-12 14:35
select @MaxID:=MAX(ID) from `order_list`;
select @MaxID;
有无结果
15楼 发表于 2011-01-12 14:35
SQL code
begin
declare i int default 1;
DECLARE theNumOfZero2 INT ;
DECLARE temp_ProductNum VARCHAR(10) DEFAULT "";
while i
16楼 发表于 2011-01-12 14:36
我单独查询的时候也是能查询出数据的.但是放到这存储过程中就不行了.
17楼 发表于 2011-01-12 15:40
贴出你的SHOW INDEX TABLENAME;和EXPPALIN SELECT
18楼 发表于 2011-01-12 16:12
之前都没有用索引.! 我想问问,如果是添加索引会快很多吗?
不是说索引在视图里面是不能用的吗?
20楼 发表于 2011-01-12 17:26
比如 A,B,C 3张表,A 和 B的join 有10条记录,而A和C的记录只有1条,这里1就是小的结果集,去join B表;
21楼 发表于 2011-01-12 18:08
我就用代码建立的.单表可以建立多个索引吧.!
22楼 发表于 2011-01-12 18:32
建立合适的索引,按照用小结果集驱动大结果集的原则来优化.
标题:
内容:

PHP: PHP技巧 - PHP基础 - PHP实例 - PHP错误代码 - 正则表达式 - 热门脚本语言: DOS命令 - vbs - CSS/HTML - python - perl - ruby - shell编程 - Powershell

JS: node.js - JS基础 - extjs - jQuery - JavaScript技巧

网址导航成语大全积木 TinyMCE 服务邮箱: Gimoohr(#)gmail.com
Copyright © 2008 Gimoo.Net  京ICP备05050695号