Как обработать тайм-аут HttpWebRequest в F # Async.Parallel

Я просто долго ломал себе зубы почему этот код «зависал» для некоторых URL-адресов:

let getImage (imageUrl:string) =
    async {
        try
            let req = WebRequest.Create(imageUrl) :?> HttpWebRequest
            req.UserAgent <- "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)";
            req.Method <- "GET";
            req.AllowAutoRedirect <- true;
            req.MaximumAutomaticRedirections <- 4;
            req.Timeout <- 3000; //HAHAHA, nice try!
            let! response1 = req.AsyncGetResponse()
            let response = response1 :?> HttpWebResponse
            use stream = response.GetResponseStream()
            let ms = new MemoryStream()
            let bytesRead = ref 1
            let buffer = Array.create 0x1000 0uy
            while !bytesRead > 0 do
                bytesRead := stream.Read(buffer, 0, buffer.Length)
                ms.Write(buffer, 0, !bytesRead)
            return SuccessfulDownload(imageUrl, ms.ToArray())

        with
            ex -> return FailedDownload(imageUrl, ex.Message)
    }

После того, как мне удалось отследить, какой из 3000 URL-адресов завис, я узнал, что AsyncGetResponse не обращает внимания на HttpWebRequest.Timeout . Я провел небольшой поиск, который вызывает предложения обернуть асинхронный запрос в поток с таймером. Это отлично подходит для C #, но если я запускаю 3000 таких через Async.Parallel |> 11 579,6 МБ 0,9 ГБ 1,5 ГБ. Как видите, индекс почти в 2 раза больше. И есть одна таблица с ~ 7 миллионами ...

У меня есть база данных со следующей статистикой

Tables     Data   Index   Total
11     579,6 MB  0,9 GB  1,5 GB

Итак, как вы можете видеть, индекс почти в 2 раза больше. И есть одна таблица с ~ 7 миллионами строк, которая занимает не менее 99% этого.

У меня также есть два очень похожих индекса

a) UNIQUE KEY `idx_customer_invoice` (`customer_id`,`invoice_no`),
b) KEY `idx_customer_invoice_order` (`customer_id`,`invoice_no`,`order_no`)

Обновление : Вот определение таблицы (по крайней мере, структурно) самой большой таблицы

CREATE TABLE `invoices` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `customer_id` int(10) unsigned NOT NULL,
  `order_no` varchar(10) default NULL,
  `invoice_no` varchar(20) default NULL,
  `customer_no` varchar(20) default NULL,
  `name` varchar(45) NOT NULL default '',
  `archived` tinyint(4) default NULL,
  `invoiced` tinyint(4) default NULL,
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `group` int(11) default NULL,
  `customer_group` int(11) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `idx_customer_invoice` (`customer_id`,`invoice_no`),
  KEY `idx_time` (`time`),
  KEY `idx_order` (`order_no`),
  KEY `idx_customer_invoice_order` (`customer_id`,`invoice_no`,`order_no`)
) ENGINE=InnoDB AUTO_INCREMENT=9146048 DEFAULT CHARSET=latin1 |

Обновление 2 :

mysql> show indexes from invoices;
+----------+------------+----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table    | Non_unique | Key_name                   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| invoices |          0 | PRIMARY                    |            1 | id          | A         |     7578066 |     NULL | NULL   |      | BTREE      |         |
| invoices |          0 | idx_customer_invoice       |            1 | customer_id | A         |          17 |     NULL | NULL   |      | BTREE      |         |
| invoices |          0 | idx_customer_invoice       |            2 | invoice_no  | A         |     7578066 |     NULL | NULL   | YES  | BTREE      |         |
| invoices |          1 | idx_time                   |            1 | time        | A         |      541290 |     NULL | NULL   |      | BTREE      |         |
| invoices |          1 | idx_order                  |            1 | order_no    | A         |        6091 |     NULL | NULL   | YES  | BTREE      |         |
| invoices |          1 | idx_customer_invoice_order |            1 | customer_id | A         |          17 |     NULL | NULL   |      | BTREE      |         |
| invoices |          1 | idx_customer_invoice_order |            2 | invoice_no  | A         |     7578066 |     NULL | NULL   | YES  | BTREE      |         |
| invoices |          1 | idx_customer_invoice_order |            3 | order_no    | A         |     7578066 |     NULL | NULL   | YES  | BTREE      |         |
+----------+------------+----------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

У меня следующие вопросы:

  1. Есть ли способ найти неиспользуемые индексы в MySQL?
  2. Есть ли какие-нибудь распространенные ошибки, влияющие на размер индекса?
  3. Можно ли безопасно удалить indexA?
  4. Как можно измерить размер каждого индекса? Все, что я получаю, - это сумма всех индексов.
13
задан Peter Lindqvist 19 April 2011 в 08:49
поделиться